跳至主要內容

任意

警告:請勿將 anymixed 混淆。它也不同於 empty

如果您想要一種方法來選擇不使用類型檢查器,any 就是這樣做的方法。使用 any 完全不安全,並且應盡可能避免使用。

例如,以下程式碼不會報告任何錯誤

1function add(one: any, two: any): number {2  return one + two;3}4
5add(1, 2);     // Works.6add("1", "2"); // Works.7add({}, []);   // Works.

即使會導致執行時期錯誤的程式碼也不會被 Flow 捕捉

1function getNestedProperty(obj: any) {2  return obj.foo.bar.baz;3}4
5getNestedProperty({});

只有少數情況下您可能會考慮使用 any

  1. 當您正在將現有程式碼轉換為使用 Flow 類型時,並且您目前被阻止類型檢查程式碼(可能需要先轉換其他程式碼)。
  2. 當你確定你的程式碼運作正常,但 Flow 卻無法正確地檢查類型時。JavaScript 中有越來越少的慣用語法,Flow 無法靜態地進行類型檢查。

你可以透過啟用 unclear-type 程式碼檢查規則來禁止 any

你可以使用 coverage 指令來識別被標記為 any 的程式碼。

避免外洩 any

當你有一個類型為 any 的值時,你可以讓 Flow 推斷出你執行所有運算的結果為 any

例如,如果你取得一個類型為 any 的物件屬性,其結果值也會是類型 any

1function fn(obj: any) {2  let foo = obj.foo; // Results in `any` type3}

你接著可以在另一個運算中使用結果值,例如將其當成數字相加,而結果也會是 any

1function fn(obj: any) {2  let foo = obj.foo; // Results in `any` type3  let bar = foo * 2; // Results in `any` type4}

你可以持續這個過程,直到 any 外洩到你的程式碼各處。

1function fn(obj: any) {2  let foo = obj.foo;3  let bar = foo * 2;4  return bar; // Results in `any` type5}6
7let bar = fn({ foo: 2 }); // Results in `any` type8let baz = "baz:" + bar; // Results in `any` type

透過盡快將 any 轉換為其他類型來防止這種情況發生。

1function fn(obj: any) {2  let foo: number = obj.foo;3}

現在你的程式碼不會外洩 any