前言
比如现在有类型A和B
type A = {
name: string
age: number
hasGirlFriend: boolean
}
type B = {
name: string
age: number
phone: string
}
现在想构造一个新的类型C,它拥有A和B的公共类型name和age
type C = {
name: string
age: number
}
方法
- 首先我们想到可以使用ts内置的Extract类型来提取两个类型的公共部分
type C = Extract<A, B>
但是此时type C = never
- 观察一下发现
type Extract<T, U> = E extends U ? T : never,这里应该使用keyof A和keyof B,因为Extract的参数是两个联合类型
type C = Extract<keyof A, keyof B>
此时我们发现type C = 'name' | 'string'
- 然后想到可以使用Pick从A&B从提取,于是最终结果是
type C = Pick<A & B, Extract<keyof A, keyof B>>