联合类型

多种不同的类型的组合。

  1. {
  2. interface Bird {
  3. fly(): void;
  4. layEggs(): void;
  5. }
  6. interface Fish {
  7. swim(): void;
  8. layEggs(): void;
  9. }
  10. const getPet: () => Bird | Fish = () => {
  11. return {
  12. // ...
  13. } as Bird | Fish;
  14. };
  15. const Pet = getPet();
  16. Pet.layEggs(); // ok
  17. // 类型“Bird | Fish”上不存在属性“fly”。
  18. // 类型“Fish”上不存在属性“fly”。ts(2339)
  19. // Pet.fly();
  20. }

交叉类型

将多个类型合并成一个类型。合并后类型将拥有所有成员类型。交叉类型的真正用武之地是将多个接口类型合并成一个类型。

如果合并的多个接口类型存在同名属性会是什么效果呢?

  1. type IntersectionTypeConfict = { id: number; name: string; }
  2. & { age: number; name: number; };
  3. const mixedConflict: IntersectionTypeConfict = {
  4. id: 1,
  5. name: 2, // ts(2322) 错误,'number' 类型不能赋给 'never' 类型
  6. age: 2
  7. };
  • 如果同名类型不兼容,合并后,将会出现两个类型的交叉类型,如同名属性 name: string 和 name: number。合并后 name: string & number,即 never。
  • 如果同名类型兼容,比如一个是 number,另一个是 number 的子类型、数字字面量类型,合并后 name 属性的类型就是两者中的子类型。

合并联合类型

合并联合类型为一个交叉类型,这个交叉类型需要同时满足不同的联合类型限制,也就是提取了所有联合类型的相同类型成员。这里,我们也可以将合并联合类型理解为求交集

  1. type UnionA = 'px' | 'em' | 'rem' | '%';
  2. type UnionB = 'vh' | 'em' | 'rem' | 'pt';
  3. type IntersectionUnion = UnionA & UnionB;
  4. const intersectionA: IntersectionUnion = 'em'; // ok
  5. const intersectionB: IntersectionUnion = 'rem'; // ok
  6. const intersectionC: IntersectionUnion = 'px'; // ts(2322)
  7. const intersectionD: IntersectionUnion = 'pt'; // ts(2322)

联合、交叉组合

联合操作符 | 的优先级低于交叉操作符 &,同样,我们可以通过使用小括弧 () 来调整操作符的优先级。