ts筆記-辨析聯合型別
阿新 • • 發佈:2021-11-03
如果一個型別是多個型別的聯合型別,且多個型別含有一個公共屬性,那麼就可以利用這個公共屬性,來建立不同的型別保護區塊。這個公共屬性稱為辨識屬性,這種型別稱為辨析聯合型別。
// 示例
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情況
常用網站: SegmentFault | GitHub | 掘金社群// 當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}`) } }