挑战
将两个类型合并成一个类型,第二个类型的键会覆盖第一个类型的键。
例如
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}解答
这个挑战和 Append to object 有些类似,我们使用 keyof T得到所有属性。
type Merge<F, S> = {
[K in keyof F | keyof S]: never;
};接下来获取对应 K 的值类型。这里要提的是,根据 test case,如果 <F, S> 中有相同的键,取 S 的值类型。所以我们先判断 S 是否有该属性。
type Merge<F, S> = {
[K in keyof F | keyof S]: K extends keyof S ? S[K] : never;
};如果 S 中没有该属性,我们检查 F 上是否存在该属性,如果存在,从 F 获取值类型。
type Merge<F, S> = {
[K in keyof F | keyof S]: K extends keyof S
? S[K]
: K extends keyof F
? F[K]
: never;
};