空值
empty
類型沒有值。它是 所有其他類型的子類型(也就是 底部類型)。因此,它是 mixed
的相反類型,後者是所有類型的父類型。
使用 empty
註解您的程式碼並不常見。但是,在某些情況下,它可能很有用
如果你有一個總是會拋出例外狀況的函式,你可以註解回傳值為 empty
,因為函式從未回傳
1function throwIt(msg: string): empty {2 throw new Error(msg);3}
你可以使用轉型為 empty
來斷言你已經精簡掉聯合的所有成員
1function f(x: 'a' | 'b'): number {2 switch (x) {3 case 'a':4 return 1;5 case 'b':6 return 2;7 default:8 return (x: empty);9 }10}
如果你沒有檢查聯合的所有成員(例如,將 x
變更為 'a' | 'b' | 'c'
型別),那麼 x
在 default
中將不再是 empty
,而 Flow 會產生錯誤。
注意:如果你想要預設徹底檢查列舉,而不需要轉型為
empty
,你可以在你的專案中啟用並使用 Flow 列舉。
由於 empty
是所有型別的子型別,因此所有運算都允許在具有 empty
型別的項目上執行。然而,由於沒有值可以是 empty
,因此這與 any
不同,是「安全的」。
1const str = "hello";2
3if (typeof str === "string") {4 (str: string); // Yes it's a string5} else {6 // Works! Since we will never enter this branch7 (str: empty);8 const n: number = str + 1;9}
我們在上面將「安全」放在引號中,因為由於你的程式碼中的型別安全性漏洞或 Flow 本身的錯誤,有可能會取得型別為 empty
的值。
你可以使用 coverage 指令來識別型別為 empty
的程式碼。