Skip to main content

645 - Diff

Answer TestCases

获取两个接口类型中的差值属性。

type Foo = {
a: string
b: number
}
type Bar = {
a: string
c: boolean
}

type Result1 = Diff<Foo, Bar> // { b: number, c: boolean }
type Result2 = Diff<Bar, Foo> // { b: number, c: boolean }

Solution

type Diff<O, O1> = Omit<O & O1, keyof (O | O1)>

将传入的两个泛型进行交叉运算,得到交叉类型。两个泛型具有相同的 key 且 相同的 key 对应的类型也相同则会去重, 如:

type Foo = {
a: string
b: number
}
type Bar = {
a: string
c: boolean
}
type FooUnionBar = Foo & Bar

Foo & Bar 的类型为

type FooUnionBar = {
a: string
b: number
c: boolean
}

如果具有相同的 key, 但对应的类型不同时,则不同的类型也会进行交叉运算, 如:

type Foo = {
a: string
b: number
}
type Bar = {
a: number
c: boolean
}
type FooUnionBar = Foo & Bar

Foo & Bar 的类型为

type FooUnionBar = {
a: string & number
b: number
c: boolean
}

由于不存在类型 string & number, 既是 string , 又是 number, 因此该类型无法使用。

再回到题目中 keyof (O | O1) 会返回共同的属性组成的联合类型。最后再使用 Omit 删除共同的属性, 即可计算出差值属性