跳到主要內容

混合

mixed所有類型的超類型。所有值都是 mixed。不過,這表示在未精簡為更具體的類型前,允許執行的作業非常少。這是因為對 mixed 執行的有效作業必須對所有類型都有效。

一般來說,程式有數個不同的類型類別

單一類型

在此處,輸入值只能是 number

1function square(n: number) {2  return n * n;3}

一群不同的可能類型

在此處,輸入值可以是 stringnumber

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 知道 valueif 陳述式內只能是 string。這稱為 精煉

any 相比

mixed 是安全的,而 any 則不是。兩者都接受所有值,但 any 也允許所有作業,這是不安全的。

empty 相比

mixedempty 的相反。

  • 所有東西都是 mixed,但在精煉到特定類型之前,允許對其執行的作業很少。它是所有類型的超類型。
  • 沒有東西是 empty,但允許對其執行任何作業。它是所有類型的子類型。