1. 程式人生 > 其它 >ts筆記-辨析聯合型別

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}`)
  }
}
常用網站: SegmentFault | GitHub | 掘金社群