合并两个类型
题目
Github: Merge
将两个类型合并成一个类型,第二个类型的键会覆盖第一个类型的键。
type foo = {
name: string;
age: string;
}
type coo = {
age: number;
sex: string
}
type Result = Merge<foo,coo>; // expected to be {name: string, age: number, sex: string}
解题思路
首先使用 keyof
和联合类型获取两个类型的所有 key
type Merge<F, S> = {
[K in keyof F | keyof S]: any
}
接下来,判断 K
是否在 S
中,如果在,返回 S[K]
:
type Merge<F, S> = {
[K in keyof F | keyof S]: K extends keyof S ? S[K] : any
}
最后,判断 K
是否在 F
中,如果在,返回 F[K]
type Merge<F, S> = {
[K in keyof F | keyof S]: K extends keyof S ? S[K] : K extends keyof F ? F[K] : never
}
答案
type Merge<F, S> = {
[K in keyof F | keyof S]: K extends keyof S
? S[K]
: K extends keyof F
? F[K]
: never
}
验证
type Foo = {
a: number
b: string
}
type Bar = {
b: number
c: boolean
}
type cases = [
Expect<Equal<Merge<Foo, Bar>, {
a: number
b: number
c: boolean
}>>,
]