我想为函数对象创建一个类型,以仅允许将特定枚举的字符串成员用作键:
any
通过将该类型应用于我的对象,我无法推断该对象函数的返回类型,因为我必须在SharedActions
类型中将其键入为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
是否可以通过使用类型/接口来确保sharedActions
的结构而不覆盖其函数的返回类型,以便TypeScript能够正确地推断出它?
编辑:
我觉得我的意图还没有完全清楚。我在这里的重点是阻止某人在type
内使用随机密钥,但仍将推断出的有效负载(例如loading
和foo
)推断为dataTable.AsEnumerable().Select(row => row["USER_ID"]).Distinct().ToArray();
。对于共享代码库,这个想法是否可能过于保护?
答案 0 :(得分:0)
在分配给foo时只需删除您的ShareActions声明:
const sharedActions = {
[ESharedActions.SET_LOADING]: (loading: boolean) => ({
type: ESharedActions.SET_LOADING,
loading,
}),
[ESharedActions.SET_LOGGED_IN]: (loggedIn: boolean) => ({
type: ESharedActions.SET_LOADING,
loggedIn,
}),
};
在某些情况下,您宁愿键入而不是推断。在这里,如果您打算将sharedActions视为SharedActions
(意味着将(...args: any) => any
作为值对象),则可以像在示例中那样进行操作。
如果您打算操纵sharedActions的内容,则推断类型而不声明SharedActions
然后,当您确实需要使用它作为类型时,请稍后进行转换:
const sharedActions = {
[ESharedActions.SET_LOADING]: (loading: boolean) => ({
type: ESharedActions.SET_LOADING,
loading,
}),
[ESharedActions.SET_LOGGED_IN]: (loggedIn: boolean) => ({
type: ESharedActions.SET_LOADING,
loggedIn,
}),
};
// use sharedAction
// doStuff(foo.loading)
// cast finally if your only goal is to expose the result as a SharedActions type/interface
// return sharedAction as SharedActions