# 联合类型

本节聚焦对类型的求取并集的运算,联合类型。

# 基础使用

在字面量类型 介绍了利用 | 组合多个单一类型的字面量。| 也可组合不同类型的字面量值。

type YesOrNo = true | false | 'Y' | 'N' | 0 | 1 | 'Yes' | 'No';

let isOk: YesOrNo = true;
isOk = 'N';

// 报错, 值不属于上述字面量集合
isOk = 'foo';

TIP

类型别名尽量语义化,好的名称结合类型标注可以增强代码的可读性。

实际上 | 可以组合任意类型,例如原始类型 number,string 等

// 定义一个类型可以接受 string 或 number 类型
type StringOrNumber = string | number;

// 合法
let fooBar: StringOrNumber = 1;

// 合法
fooBar = 'demo';

// 报错类型不是 string 或 number
fooBar = false;

# 对象类型结合类型断言

利用 | 组合对象类型, 结合类型断言辅助 TypeScript 进行类型检查。

type Bird = {
  fly(): void;
  layEggs(): void;
};

type Fish = {
  swim(): void;
  layEggs(): void;
};
type BirdOrFish = Bird | Fish;

function createPet(name: string) {
  switch (name) {
    case 'bird':
      return {
        fly() {},
        layEggs() {}
      };
    case 'fish':
      return {
        swim() {},
        layEggs() {}
      };
    default:
      return null;
  }
}

// 申明 pet 变量可接受 Fish 或 Bird 类型
let pet: BirdOrFish;

// 合法 断言返回结果为 Bird
pet = <Bird>createPet('bird');
pet.layEggs();
pet.fly();
// 报错, 断言为 Bird 实例不具有 swim 方法
pet.swim();

// 合法 赋值为 fish 类型, 采用 as 断言返回结果为 Fish 类型
pet = createPet('fish') as Fish;
pet.layEggs();
pet.swim();
// 报错, 断言为 Fish 实例不具有 fly 方法
pet.fly();

示例借助两种类型断言,辅助 TypeScript 类型检查,确定调用对象方法调用是否合法

# 标记联合类型

https://www.typescriptlang.org/v2/docs/handbook/release-notes/overview.html#tagged-union-types (opens new window)

# 总结

本节知识点如下:

  1. 采用 | 组合多种类型
  2. 当联合多个对象时,使用类型断言,辅助检查