混合
mixed
是 所有類型的超類型。所有值都是 mixed
。不過,這表示在未精簡為更具體的類型前,允許執行的作業非常少。這是因為對 mixed
執行的有效作業必須對所有類型都有效。
一般來說,程式有數個不同的類型類別
單一類型
在此處,輸入值只能是 number
。
1function square(n: number) {2 return n * n;3}
一群不同的可能類型
在此處,輸入值可以是 string
或 number
。
1function stringifyBasicValue(value: string | number) {2 return '' + value;3}
基於另一種類型的類型
在此處,傳回類型會與傳遞至函式的任何值類型相同。
1function identity<T>(value: T): T {2 return value;3}
這三種是最常見的類型類別。它們會構成您編寫的大部分類型。
不過,還有一個第四類別。
任意類型,可以是任何東西
這裡傳入的值是未知類型,它可以是任何類型,而函數仍然會運作。
1function getTypeOf(value: mixed): string {2 return typeof value;3}
這些未知類型比較少見,但有時仍然有用。
您應該使用 mixed
來表示這些值。
什麼都能進,什麼都出不來
mixed
會接受任何類型的值。字串、數字、物件、函數——任何東西都可以。
1function stringify(value: mixed) {2 // ...3}4
5stringify("foo");6stringify(3.14);7stringify(null);8stringify({});
當您嘗試使用 mixed
類型的值時,您必須先找出實際類型,否則您會遇到錯誤。
1function stringify(value: mixed) {2 return "" + value; // Error! 3}4
5stringify("foo");
2:10-2:19: Cannot use operator `+` with operands string [1] and mixed [2] [unsafe-addition]
相反地,您必須透過 精煉 來確保該值為某個特定類型。
1function stringify(value: mixed) {2 if (typeof value === 'string') {3 return "" + value; // Works!4 } else {5 return "";6 }7}8
9stringify("foo");
由於 typeof value === 'string'
檢查,Flow 知道 value
在 if
陳述式內只能是 string
。這稱為 精煉。
與 any
相比
mixed
是安全的,而 any
則不是。兩者都接受所有值,但 any
也允許所有作業,這是不安全的。
與 empty
相比
mixed
是 empty
的相反。
- 所有東西都是
mixed
,但在精煉到特定類型之前,允許對其執行的作業很少。它是所有類型的超類型。 - 沒有東西是
empty
,但允許對其執行任何作業。它是所有類型的子類型。