typescript - 简化 ReturnType 以合并来自对象的多个函数
问题描述
我有一个函数对象,我需要创建一个类型,它是它们返回的并集。一个简单的例子:
const actions = {
success: () => true,
count: () => 0,
};
现在,我想创建相应的类型。这可以通过以下方式完成:
type AvailableValues = ReturnType<typeof actions.success | typeof actions.failure>;
这行得通,但它非常冗长——主要是必须typeof actions
重复编写。
Pick<typeof actions, 'success' | 'failure'>
很接近,但它生成的类型是一个对象而不是函数返回类型的联合,所以我有点回到我开始的地方。
有没有办法同时提取多个返回类型?
解决方案
如果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
推荐阅读
- regex - 正则表达式排除电子邮件字段中的域列表不起作用
- javascript - 如何根据javascript中的字典将所有出现的具有特殊字符的所有子字符串替换为另一个子字符串?
- reactjs - Firebase Reactjs 从上下文中获取当前用户
- node.js - 抛出异常时,Sequelize 事务不回滚
- javascript - 如何获取嵌套 JSON 数组中的值
- python - 出于某种原因,我的代码认为全局变量是局部变量
- java - java.io.File.delete() 的异常返回值被忽略
- google-bigquery - 在 SSIS 到 Bigquery 的 devart 连接器存在问题
- ansible - 如何在ansible中搜索具有匹配属性的任何变量
- php - 获取谷歌日历,“服务帐户无法在没有全域授权的情况下邀请与会者。”