如何构建具有类型数组中所有属性的类型?
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",
};
诀窍是首先 '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 中查看。
假设我有两种类型(例如,我需要通用的东西)
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",
};
诀窍是首先 '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 中查看。