如果一個類型是多個類型的聯合類型,且多個類型含有一個公共屬性,那麼就可以利用這個公共屬性,來創建不同的類型保護區塊。這個公共屬性稱爲辨識屬性,這種類型稱爲辨析聯合類型。
// 示例
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}`)
}
}