问题 #
将两种类型合并为一种新类型。第二种类型的键将覆盖第一种类型的键。
type Foo = {
a: number;
b: string;
};
type Bar = {
b: number;
c: boolean;
};
type Result = Merge<Foo, Bar> = {
a: number;
b: number;
c: boolean;
}
解答 #
type Merge<F extends object, S extends object> = {
[K in keyof F| keyof S]: K extends keyof S ? S[K]: K extends keyof F ? F[K]: never
}
拆分 #
- 利用联合类型把所有的
key
拿出来 - 有限确定
key
是否是S
的key
返回S[K]
- 再确定
key
是否是F
的key
返回F[K]
- 都不是就返回
never