推断包含对象类型声明为“ any”的函数返回类型

时间:2020-06-09 16:11:26

标签: typescript

我想为函数对象创建一个类型,以仅允许将特定枚举的字符串成员用作键:

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内使用随机密钥,但仍将推断出的有效负载(例如loadingfoo)推断为dataTable.AsEnumerable().Select(row => row["USER_ID"]).Distinct().ToArray(); 。对于共享代码库,这个想法是否可能过于保护?

1 个答案:

答案 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,
  }),
};

Playground

在某些情况下,您宁愿键入而不是推断。在这里,如果您打算将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
相关问题