Typescript:给定一个函数表,创建一个函数,该函数接受表的键和表中函数的第二个参数
正在尝试为状态编写一个简单的存储 我有一个基本状态:Typescript:给定一个函数表,创建一个函数,该函数接受表的键和表中函数的第二个参数,typescript,typescript-typings,typescript-generics,Typescript,Typescript Typings,Typescript Generics,正在尝试为状态编写一个简单的存储 我有一个基本状态: const state = { health: 100, maxHealth: 100, }; type State = typeof state; 我有一组突变 const mutations = { setHealth: (state: State, payload: { newHealth: number }) => { state.health = payload.newHealth;
const state = {
health: 100,
maxHealth: 100,
};
type State = typeof state;
我有一组突变
const mutations = {
setHealth: (state: State, payload: { newHealth: number }) => {
state.health = payload.newHealth;
},
setMaxHealth: (state: State, payload: { newMaxHealth: number }) => {
state.maxHealth = payload.newMaxHealth;
},
} as const;
type Mutations = typeof mutations;
我要做的是创建一个函数,这个函数可以把变异的键作为它的第一个参数,把变异的有效载荷作为它的第二个参数
目前,第一个参数输入正确,但是translations[mutation]
errors withtype Parameters[1]的第二个参数不能分配给类型为“{newHealth:number;}&{newMaxHealth:number;}”的参数。
const commit = <M extends keyof Mutations>(mutation: M, payload: Parameters<Mutations[M]>[1]) => {
mutations[mutation](state, payload);
};
const commit=(变异:M,负载:参数[1])=>{
突变[突变](状态,有效载荷);
};
问题是突变[突变]
的计算结果为(状态:状态,有效载荷:{newHealth:number}&{newMaxHealth:number})=>void
,当TS希望它是{newHealth:number;}{newMaxHealth:number;}时,您的有效载荷
变量的计算结果为{newHealth:number;}
{newMaxHealth:number;}
这是有意义的,因为TS希望同时将突变[突变]
视为所有可能的函数。从TS的角度来看,为了使有效载荷
作为突变[突变]
(setHealth | setMaxHealth)的参数,它必须同时匹配所有可能的函数定义
我处理这个问题的方法是断言突变[mutation]
与我们的有效载荷
类型相匹配:
interface State {
health: number;
maxHealth: number;
}
const mutations = {
setHealth: (state: State, { newHealth }: { newHealth: number }) => {
state.health = newHealth;
},
setMaxHealth: (state: State, { newMaxHealth }: { newMaxHealth: number }) => {
state.maxHealth = newMaxHealth;
},
};
type Mutations = typeof mutations;
const o = {
state: { health: 0, maxHealth: 0 },
commit<M extends keyof Mutations, P extends Parameters<Mutations[M]>[1]>(mutation: M, payload: P) {
(mutations[mutation] as (state: State, payload: P) => void)(this.state, payload);
},
};
o.commit("setHealth", { newHealth: 50 });
o.commit("setMaxHealth", { newMaxHealth: 100 });
接口状态{
健康:数字;
maxHealth:数字;
}
常数突变={
setHealth:(state:state,{newHealth}:{newHealth:number})=>{
state.health=newHealth;
},
setMaxHealth:(状态:状态,{newMaxHealth}:{newMaxHealth:number})=>{
state.maxHealth=newMaxHealth;
},
};
类型突变=突变类型;
常数o={
状态:{health:0,maxHealth:0},
提交(变异:M,有效载荷:P){
(突变[突变]为(状态:状态,有效载荷:P)=>void)(this.state,有效载荷);
},
};
o、 提交(“setHealth”,{newHealth:50});
o、 提交(“setMaxHealth”,{newMaxHealth:100});
(旁注:对有效负载类型使用泛型p
意味着具有额外成员的对象将被视为有效对象,例如o.commit(“setMaxHealth”,{newMaxHealth:100,x:1})
不会出错。如果您不需要此功能,只需在每个位置用p
替换参数[1]
)
祝你好运