typescript - 在 Typescript 中合并对象类型的区分联合
问题描述
是否可以在对象类型的区分联合中合并所有属性?
例如,假设我有以下类型:
type UnionType = { name: string; } | { age: number; } | { visible: boolean; }
是否可以将它们合并为一个类型,如下所示:
// Expect: { name: string; age: number; visible: boolean };
type Props = MagicType<UnionType>;
这本质上是Unionize
from 类型的逆utility-types
。
解决方案
您可以使用此问题的答案将联合变成交叉点,并附带所有注意事项:
type UnionToIntersection<U> =
(U extends any ? (k: U) => void : never) extends ((k: infer I) => void) ? I : never
如果您不喜欢这种方式,您可以要求编译器通过使用标识映射{ name: string; } & { age: number; } & { visible: boolean; }
将其重新解释为单个对象类型:
type MagicType<U> =
UnionToIntersection<U> extends infer O ? { [K in keyof O]: O[K] } : never;
这将为您提供以下输出:
type Props = MagicType<UnionType>;
/* type Props = {
name: string;
age: number;
visible: boolean;
} */
这就是你想要的。希望有帮助;祝你好运!
推荐阅读
- text - How to use grep to find a specific string of numbers and move that to a new test file
- flutter - flutter_animarker 无法关闭波纹动画
- python - 如何在字典列表中获取所有身高相同的人
- c# - Dynamics NAV 2017 .NET 互操作:发生异常,“无法加载文件或程序集”System.Runtime,版本 = 5.0.0.0
- mysql - 这是正确使用 MySQL 索引吗?为什么它似乎不起作用?
- javascript - 并发 Promise 的顺序如何在异步函数中工作?
- javascript - 如何使用 multer 将 react-native 图像从 expo-image-picker 上传到 Express.js 服务器
- java - 如何在 Java 中只读取文件中每一行的第一个单词?
- android - 测试所选文本是否在 EditText 中完全可见
- python - 优化python中的嵌套迭代器