typescript 简化对象中多个函数的联合的ReturnType

e3bfsja2  于 2023-01-06  发布在  TypeScript
关注(0)|答案(2)|浏览(118)

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

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/MYewdgzgLgBAhsKBLcEYF4YG8BQMYQCuwwAphBAFwwAUAlBgHwxQBOhpANHjKIWFGr0mMAAzcAvgG4cOKAE8ADqRgBBAG5wkAGzgAjbaQBqcbRzSYASqSiFWYACpLSAHgXKQAM3iIUkAHREJORoAD4szl4+yKj+fAKMUkA

zz2j4svz

zz2j4svz1#

如果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约束其输入之外,基本上与ReturnType<T[K]>相同(参见库定义)。
对于你的类型,它会得到同样的结果:

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

Playground代码链接

ctehm74n

ctehm74n2#

这对我很有效。

type Actions = typeof actions;

type AvailableValues = ReturnType<Actions[keyof Actions]>

相关问题