如何构建具有类型数组中所有属性的类型?

How can I build a Type that has all the properties from an array of Types?

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

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

我想编写一个通用类型,让我可以做这样的事情

type ABMerge = ArrayMerge<[TypeA,TypeB]>

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

我试过使用泛型和条件类型,但我不知道如何 "iterate" 我的泛型数组。

您可以在 Typescript 中简单地使用类型交集运算符 &

type A = { propA: number };
type B = { propB: string };

type AB = A & B;

const ab: AB = {
    propA: 42,
    propB: "hello, world",
};

See on the playground

诀窍是首先 'overlay' 使用 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

playground 中查看。