複数の方のうちのいずれかをとる値を表現できる

型1 | 型2 | ... の形式で定義できる

let value: boolean | number;
value = true; // OK
value = 100; // OK

判別可能なユニオン型

共通のリテラル型のプロパティを持つ特別なユニオン型

共通のプロパティを利用して、型を判別することができる

type Triangle = { kind: "triangle"; base: number; height: number };
type Rectangle = { kind: "rectangle"; width: number; height: number };
type Shape = Triangle | Rectangle;

function getArea(shape: Shape): number {
  // 共通のプロパティkindを使って型を判定
  switch (shape.kind) {
    case "triangle":
      // 仮引数shapeはTriangle型であると判定される
      return (shape.base * shape.height) / 2;
    case "rectangle":
      // 仮引数shapeはRectangle型であると判定される
      return shape.width * shape.height;
  }
}