599 - 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}
Solution
type Merge2<
F extends Record<string, unknown>,
S extends Record<string, unknown>
> = {
[K in keyof (F & S)]: K extends keyof S
? S[K]
: K extends keyof F
? F[K]
: never
}
F
和 S
继承自 Record<string, unknown>
要求 F
和 S
必须是对象类型
keyof (F & S)
返回 F
和 S
中 key
组成的联合类型, 相同的 key
会去重
接着遍历这个联合类型, 优先判断 key
是否在 S
中, 存在则返回 S[K]
, 否则判断 key
是否在 F
中, 存在则返回 F[K]
需要注意的是,不可写成下面的判断形式
[K in keyof (F & S)]: K extends keyof S ? S[K] : F[K]
由于 K
仅仅只是一个字符串类型,尽管已经判断了 K
不属于 keyof S
, 但也不代表属于 keyof F
, 因此不能在最后使用 F[K]