首页 > 解决方案 > 简化 ReturnType 以合并来自对象的多个函数

问题描述

我有一个函数对象,我需要创建一个类型,它是它们返回的并集。一个简单的例子:

const actions = {
  success: () => true,
  count: () => 0,
};

现在,我想创建相应的类型。这可以通过以下方式完成:

type AvailableValues = ReturnType<typeof actions.success | typeof actions.failure>;

这行得通,但它非常冗长——主要是必须typeof actions重复编写。

Pick<typeof actions, 'success' | 'failure'>很接近,但它生成的类型是一个对象而不是函数返回类型的联合,所以我有点回到我开始的地方。

有没有办法同时提取多个返回类型?

请在此处查看设置示例:https ://www.typescriptlang.org/play?#code/MYewdgzgLgBAhsKBLcEYF4YG8BQMYQCuwwAphBAFwwAUAlBgHwxQBOhpANHjKIWFGr0mMAAzcAvgG4cOKAE8ADqRgBBAG5wkAGzgAjbaQBqcbRzSYASqSiFWYACpLSAHgRoADsKQAM3i+yIUk

标签: typescript

解决方案


如果actions那里有一些非函数,或者如果您需要手动指定"success"并且"count"出于某种原因(可能还有其他您想要返回类型的函数),那么您可以通过使用查找类型来获取"success""count"键处的函数类型,如下所示:

type AvailableValues = ReturnType<(typeof actions)['success' | 'count']>

查找类型是括号符号,其中给定类型T和键类型K(或键的联合),然后该键的属性类型(或这些键的属性类型的联合)为T[K].


如果你想得到一个对象类型的所有函数值属性的返回类型的联合,你可以这样写:

type ReturnTypesOfFunctionProps<T> = {
  [K in keyof T]: T[K] extends (...args: any) => infer R ? R : never
}[keyof T];

请注意,这T[K] extends (...args: any) => infer R ? R : never是使用条件类型推断,除了限制其输入外,基本上与ReturnType<T[K]>(参见库定义)相同。ReturnType

然后对于您的类型,它会产生相同的结果:

type AvailableValues2 = ReturnTypesOfFunctionProps<typeof actions>;
// type AvailableValues2 = number | boolean

Playground 代码链接


推荐阅读