ts筆記-辨析聯合類型

如果一個類型是多個類型的聯合類型,且多個類型含有一個公共屬性,那麼就可以利用這個公共屬性,來創建不同的類型保護區塊。這個公共屬性稱爲辨識屬性,這種類型稱爲辨析聯合類型。

// 示例
interface Square {
  kind: 'square';
  size: number;
}

interface Rectangle {
  kind: 'rectangle';
  width: number;
  height: number;
}

type Shape = Square | Rectangle;

求面積

function area(s: Shape) {
  switch (s.kind) {
    case 'square':
      return s.size * s.size;
    case 'rectangle':
      return s.width * s.height;
  }
}

area用於求面積,但是如果聯合類型添加了其他類型,area函數沒有定義成處理這種類型的方法,就會導致bug參數。

interface Square {
  kind: 'square';
  size: number;
}

interface Rectangle {
  kind: 'rectangle';
  width: number;  
  height: number;
}

interface Circle {
  kind: 'circle';
  radius: number;
}


type Shape = Square | Rectangle | Circle;

function area(s: Shape) {
  switch (s.kind) {
    case 'square':
      return s.size * s.size;
    case 'rectangle':
      return s.width * s.height;
  }
}

// 編譯通過,有隱藏的bug
area({
  kind: 'circle',
  radius: 1
})

爲了避免這種潛在bug的出現,我們可以定義一個default情況

// 當Shape增加了新類型,但是area函數沒有處理這種類型,編譯直接報錯
// 比如新增了Circle類型,不能將類型“Circle”分配給類型“never”
function area(s: Shape) {
  switch (s.kind) {
    case 'square':
      return s.size * s.size;
    case 'rectangle':
      return s.width * s.height;
    default:
      const invalidKind: never = s
      throw new Error(`Unknown ${invalidKind}`)
  }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章