合并两个类型
题目
Github: Merge
将两个类型合并成一个类型,第二个类型的键会覆盖第一个类型的键。
interface foo {
name: string
age: string
}
interface 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
}
验证
interface Foo {
a: number
b: string
}
interface Bar {
b: number
c: boolean
}
type cases = [
Expect<Equal<Merge<Foo, Bar>, {
a: number
b: number
c: boolean
}>>,
]