Skip to main content

Unions and Intersection types

注意: Unions 和 Intersection 使用在 primitive type 和 object 的表現會「感覺」不太一樣

Unions 聯集 (OR)

  • 能夠符合其中一種型別即可。
  • 使用垂直線 | 來組合多個類型。例如,string | number 表示變數可以是字符串或數字。

Intersection 交集 (AND)

  • 要同時符合多個型別。
  • 使用 & 符號來組合多個類型。
  • 對於 primitive type ,通常用 & 會變成 never,因為不可能同時滿足兩個 primitive type。
  • 對於 object,它必須同時具有所有類型的屬性,缺一不可。例如,TypeA & TypeB 表示一個值需同時具有 TypeA 和 TypeB 的特性。
/** 對於 primitive type 來說 */
type UnionPrimitive = string | number; // string | number
type IntersectionPrimitive = string & number; // never

/** 對於 object type 來說 */
type Circle = {
color: string;
radius: number;
};

type Rectangle = {
color: string;
width: number;
height: number;
};

// 只需符合 Circle 的屬性或 Rectangle 的屬性即可
const foo: Circle | Rectangle = {
color: "red",
radius: 15,
height: 20,
};

// 需要同時帶有 Circle 和 Rectangle 中的屬性(缺一不可)
const bar: Circle & Rectangle = {
color: "red",
radius: 15,
width: 30,
height: 20,
};

參考資料