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}
// ============= Test Cases =============
import type { Equal, Expect } from './test-utils'
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
}>>,
]
// ============= Your Code Here =============
// 错误答案
// type Merge<F extends {}, S extends {}> ={
// [K in keyof (F | S)]:K extends keyof S ?S[K]:K extends keyof F ?F[K]:never
// }
// 答案
type Merge<F extends {}, S extends {}> ={
[K in keyof F | keyof S]:K extends keyof S ?S[K]:K extends keyof F ?F[K]:never
}
type Union=keyof (Foo| Bar) // b
这里原本已经很接近正确答案了,一直想不通为什么不对,原来是 keyof (F | S) 和 keyof F | keyof S 并不相同,一个是先取联合类型,联合类型中 a 和 c 是可选属性,只有 b 是必选属性,所以 keyof (F | S) 的值是 b, 而 keyof F | keyof S 的值是 a|b|c ,这点需要注意,其次,可以发现,后面的对象中的属性类型覆盖前一个对象中的属性。所以判断时,首先取后面对象中的属性的类型。