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 with
type 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]

祝你好运