【发布时间】:2020-09-28 21:24:57
【问题描述】:
我想为函数对象创建一个类型,只允许特定枚举的字符串成员作为键:
enum ESharedActions {
SET_LOADING = 'SET_LOADING',
SET_LOGGED_IN = 'SET_LOGGED_IN',
}
type SharedActions = { [key in ESharedActions]: (...args: any) => any }
通过将该类型应用于我的对象,我无法推断该对象函数的返回类型,因为我必须在SharedActions 类型中将其键入为any。
const sharedActions: SharedActions = {
[ESharedActions.SET_LOADING]: (loading: boolean) => ({
type: ESharedActions.SET_LOADING,
loading,
}),
[ESharedActions.SET_LOGGED_IN]: (loggedIn: boolean) => ({
type: ESharedActions.SET_LOADING,
loggedIn,
}),
};
const foo = sharedActions[ESharedActions.SET_LOADING](true) // infers to `any`, should infer to { type: ESharedActions, loading: boolean }
是否可以通过使用类型/接口而不覆盖其函数返回类型来确保 sharedActions 结构,以便 TypeScript 能够正确推断它?
编辑:
我觉得我的意图还没有完全清楚。我的重点是防止有人在sharedActions 中使用随机密钥,但仍然可以推断出foo 的有效载荷(例如type 和loading)。对于共享代码库,这个想法是否过于保护?
【问题讨论】:
-
所以你不想改变
SharedActions的定义(? -
我暂时将其更改为
(...args: any) => { type: ESharedActions, [key: string]: any },但这样foo中只有type可用,剩余的有效负载(例如loading、loggedIn)会丢失。 -
你想限制哪一部分,..args 还是返回类型?
标签: typescript