因此,我们目前正在使用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检查,或者是否有解决此问题的另一种方法。
答案 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();
}
}