Skip to main content

27932 - MergeAll

Answer TestCases

合并多个类型到一个新类型。如果键有重叠,其值应合并为一个联合。

例如:

type Foo = { a: 1; b: 2 }
type Bar = { a: 2 }
type Baz = { c: 3 }

type Result = MergeAll<[Foo, Bar, Baz]> // expected to be { a: 1 | 2; b: 2; c: 3 }

Solution

type MergeAll<
XS extends object[],
U = XS[number],
K extends PropertyKey = U extends U ? keyof U : never
> = {
[P in K]: U extends U ? U[P & keyof U] : never
}

UXS 所有成员构成的联合类型, KXS 所有成员的属性名构成的联合类型

通过映射类型构造结果

U extends U ? U[P & keyof U] : never 遍历联合类型, 并取出相应的属性类型。

P & keyof UPkeyof U 的交集, 用于确保 Pkeyof U 子集。