任意
如果您想要一種方法來選擇不使用類型檢查器,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
- 當您正在將現有程式碼轉換為使用 Flow 類型時,並且您目前被阻止類型檢查程式碼(可能需要先轉換其他程式碼)。
- 當你確定你的程式碼運作正常,但 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
。