Typescript提取多个类型的公共部分

247 阅读1分钟

前言

比如现在有类型AB

type A = {
    name: string
    age: number
    hasGirlFriend: boolean
}

type B = {
    name: string
    age: number
    phone: string
}

现在想构造一个新的类型C,它拥有AB的公共类型name和age

type C = {
    name: string
    age: number
}

方法

  1. 首先我们想到可以使用ts内置的Extract类型来提取两个类型的公共部分
type C = Extract<A, B>

但是此时type C = never

image.png

  1. 观察一下发现 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'

image.png

  1. 然后想到可以使用Pick从A&B从提取,于是最终结果是
type C = Pick<A & B, Extract<keyof A, keyof B>>

image.png