首页 > 解决方案 > 如何构建具有类型数组中所有属性的类型?

问题描述

假设我有两种类型(例如,我需要一些通用的)

type TypeA = { propA: string};
type TypeB = { propB: number};

我想写一个允许我做这样的事情的通用类型

type ABMerge = ArrayMerge<[TypeA,TypeB]>

// ABMerge would look like { propA: string, propB: number }

我尝试过使用泛型和条件类型,但我不知道如何“迭代”我的泛型类型数组。

标签: typescripttypescript-generics

解决方案


诀窍是首先将所有数组元素“叠加”到一个上,使用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

在操场上看看。


推荐阅读