手动实现TS类型中的交叉并集类型

37 阅读1分钟

TS类型中的交叉并集类型,需要手动实现

在ts中有&和|操作符,对于初学者来说,&和|在类型联合中并不符合交集并集的数学思维预期。通常数学思维我们期待,交集是指两个类型的共有属性,并集是两个类型的所有属性并去重。

实际上,ts中的&表现如下

type A={
  name:string;
  id:string;
  tel:string;
}
type B={
  name:string;
  id:number;
  email:string;
}
type C=A&B
// C将会是
{
  name:string;
  id:never;  // 这里因为AB的id类型不一致
  tel:string;
  email:string;
}

ts中的|表现如下

type C=A|B
// C将会是
{
  name:string;
  id:number;
  email:string;
}|{
  name:string;
  id:string;
  tel:string;
}

所以需要手动取合集,这里利用泛型做了一层通用封装。

type CommonProperties<T, U> = {
  [K in keyof T & keyof U]: T[K] | U[K]; 
  // 这里的&表示需要在多个类型中共有
  // 这里的|表示如果类型同名,但值类型不一致,则取|进行通用性保留,也可以改成&,不一致时则为never
};

突然觉得这种问gpt就可以的确实没必要写成掘金。。。不过写了就随手更新一下