使用带有strictFunctionTypes的枚举的TypeScript函数参数

时间:2018-06-28 15:51:43

标签: typescript enums redux

因此,我们目前正在使用TypeScript 2.9中的所有严格选项,这使我们能够在代码库中找到一些问题。但是现在,使用一个需要唯一对象类型的JS库遇到了一个有趣的挑战。

结构非常简单,我们有一个对象,其中键是字符串,值是函数,它们采用单个对象,其中定义了类型属性,该属性与对象的键相同,因为我们喜欢枚举,尝试过这个:

df %>%
    gather("key", "value", state1, state2, state3) %>% 
    group_by(value) %>%
    summarise(n=n())

但是,由于我们使用严格的选项,因此TypeScript的函数的类型参数存在问题(请参见playground)。我们之所以要手动键入对象,是为了验证操作对象中是否存在所有枚举选项(请参见const enum Actions { Resume = 'resume', Stop = 'stop' } type action = (data: { type: Actions }) => Promise<any>; //Types of property 'type' are incompatible. Type Actions is not assignable to type Actions.Resume export const actions: { [key in Actions]: action} = { [Actions.Resume]: (data: { type: Actions.Resume }) => { return Promise.resolve(); }, [Actions.Stop]: (data: { type: Actions.Stop }) => { return Promise.resolve(); } } 部分)。但这意味着我们还必须键入函数,否则我们将丢失其类型的函数。

我想知道是否可以使用strictFunctionTypes检查,或者是否有解决此问题的另一种方法。

1 个答案:

答案 0 :(得分:2)

我不确定该错误,但是您可以尝试以下方法:

type Action<T> = (data: { type: T }) => Promise<any>;

export const actions: { [P in Actions]: Action<P> } = {
    [Actions.Resume]: (data: { type: Actions.Resume }) => {
        return Promise.resolve();
    },
    [Actions.Stop]: (data: { type: Actions.Stop }) => {
        return Promise.resolve();
    }
}

这还将防止您的actions对象键和回调应接受的data.type之间存在不匹配,我认为这是您想要的:

export const actions: { [P in Actions]: Action<P> } = {
    [Actions.Resume]: (data: { type: Actions.Stop }) => {
        return Promise.resolve();
    }
}
  

Type'{type:Actions.Resume; }'不能分配给类型'{type:Actions.Stop; }'

事实上,回调data类型现在应该在上下文中输入:

export const actions: { [P in Actions]: Action<P> } = {
    [Actions.Stop]: data => {
        data.type // Actions.Stop
        return Promise.resolve();
    }
}