typescript - 如何构建具有类型数组中所有属性的类型?
问题描述
假设我有两种类型(例如,我需要一些通用的)
type TypeA = { propA: string};
type TypeB = { propB: number};
我想写一个允许我做这样的事情的通用类型
type ABMerge = ArrayMerge<[TypeA,TypeB]>
// ABMerge would look like { propA: string, propB: number }
我尝试过使用泛型和条件类型,但我不知道如何“迭代”我的泛型类型数组。
解决方案
诀窍是首先将所有数组元素“叠加”到一个上,使用T[number]
. 这为我们提供了所有类型的联合(如TypeA | TypeB
)。
因为你想要一个交集类型 ( ),所以我们可以使用这个答案TypeA & TypeB
中的漂亮技巧将该联合转换为交集。
完整示例:
type UnionToIntersection<U> =
(U extends any ? (k: U) => void : never) extends ((k: infer I) => void) ? I : never
type ArrayMerge<T extends Array<any>> = UnionToIntersection<T[number]>;
// Test it:
type TypeA = { propA: number };
type TypeB = { propB: string };
const ab: ArrayMerge<[TypeA, TypeB]> = {
propA: 42,
propB: "x",
};
ab.propA; // number
ab.propB; // string
在操场上看看。
推荐阅读
- opencv - 如何在 AMD GPU 上使用 DNN OPENCL?
- teamcity - 代理端结帐恢复为 Perforce Stream Depot 的服务器端结帐
- javascript - 将输入文本传递到客户端并保存为变量
- javascript - 如何使用 Angular 8 中通过其他服务中的组件保存在服务中的值?
- django - 使用扩展用户获取模型中的用户名
- amazon-cognito - AWS Cognito,检索旧的编辑自定义值
- amazon-web-services - AWS Step-Function:将特定值从一个 AWS lambda 传递到另一个在 step 函数并行状态下
- android - 使用导航架构组件时后退按钮不起作用
- maven - GoogleCloudPlatform / Java 入门 - 基本应用程序失败
- linux - 目前是否可以在 Linux 上使用带有 Core 3.1 的伪 tty