我有一个函数对象,我需要创建一个类型,它是它们返回的函数的并集。一个简单的例子:
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
如果actions
中有一些非函数,或者由于某种原因需要手动指定"success"
和"count"
(可能还有其他函数不想要返回类型(,则可以通过使用查找类型来获取"success"
和"count"
键处的函数类型,如下图所示:
type AvailableValues = ReturnType<(typeof actions)['success' | 'count']>
查找类型是方括号表示法,其中给定类型T
和键类型K
(或键的并集(,则该键处的属性类型(或这些键处属性类型的并集(union((为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
游乐场链接到代码
这对我有效。
type Actions = typeof actions;
type AvailableValues = ReturnType<Actions[keyof Actions]>