跳至主要內容

Flow Strict

您可以在檔案中加入 @flow strict,為 Flow 啟用更強的安全保證(例如禁止 any/Object/Function 類型,並要求所有相依項都必須有類型)。

概觀

Flow 的設計易於採用,因此允許您在某些情況下選擇不進行類型檢查,允許不安全的行為。但由於許多程式碼庫現在都廣泛採用 Flow 類型,因此可以翻轉這個權衡。您可以使用 Flow Strict 禁止先前允許的不安全模式。這可為您提供更佳的安全保證,可偵測更多錯誤,並讓重構更容易。而且您可以逐檔案逐步實作這些更強的保證。

功能

為檔案啟用 Flow Strict 表示幾個先前允許的模式現在會觸發 Flow 錯誤。每個不允許的模式都有對應的 Flow 程式碼檢查 規則,會觸發錯誤。@flow strict 啟用的規則清單會設定在每個 .flowconfig 中。以下是建議的規則

  • nonstrict-import:從非 @flow strict 的模組匯入時觸發錯誤。這非常重要,因為這表示當檔案標示為 strict 時,其所有依賴項也都是 strict 的。
  • unclear-type:在型別註解中使用 ObjectFunctionany 時觸發錯誤。
  • untyped-import:從未設定型別的模組匯入時觸發錯誤。
  • untyped-type-import:從未設定型別的模組匯入型別時觸發錯誤。
  • unsafe-getters-setters:使用 getter 和 setter 時觸發錯誤,因為它們可能不安全。
  • sketchy-null:對可能為 null/undefined 或假值的變數進行存在檢查時觸發錯誤。

如需所有可用 lint 規則的完整清單,請參閱 Lint 規則參考

此外,請注意,函式參數視為 const(亦即,視為使用 const 而不是 let 宣告)。此功能在 Flow Strict 中尚無法設定;它始終處於開啟狀態。

.flowconfig 中啟用 Flow Strict

Flow Strict 在每個 .flowconfig 中設定。如要啟用

  1. [strict] 區段新增至 .flowconfig
  2. 列出要啟用的 lint 規則。強烈建議使用這些規則
[strict]
nonstrict-import
unclear-type
unsafe-getters-setters
untyped-import
untyped-type-import

也建議使用,但由於在某些程式碼庫中可能會太過繁瑣,因此為選用:sketchy-null

我們建議您從一開始就啟用所有您想要的規則,然後逐檔案採用 Flow Strict。這比啟用單一規則、將 @flow strict 新增至多個檔案,然後再將更多規則新增至設定檔來得更好。

採用

@flow strict 新增至檔案並修正所有出現的錯誤。由於 Flow Strict 要求依賴項也必須是 strict(如果已啟用 nonstrict-import 規則),因此請從依賴項樹的葉節點開始,然後逐層往上處理。請勿新增 $FlowFixMe 來抑制新出現的錯誤;只要在所有問題都已解決後新增 @flow strict 即可。由於使用 $FlowFixMe 最常見的原因在於依賴未設定型別的依賴項或行為,因此在啟用 Flow Strict 後,未來的問題應該會大幅減少。

請大方啟用 Flow Strict。與新增或移除 @flow 不同,新增或移除 @flow strict(本身)並不會變更 Flow 涵蓋範圍。它只會防止或允許在未來新增某些新的不安全行為。即使未來必須為檔案停用 Flow Strict,至少可以防止在停用期間新增不安全行為。

函式庫定義被視為嚴格的(因為它們可以包含在許多具有矛盾嚴格設定的不同專案中)。

嚴格的區域

如果您在 Flow Strict 設定中啟用 nonstrict-import 規則(建議),則嚴格檔案的所有依賴項也必須是嚴格的。雖然這是最佳目標,但對於大型既有程式碼庫來說,在所有依賴項都變為嚴格之前,允許使用 Flow Strict 的部分優點可能是有益的。

@flow strict-local@flow strict 相同,只不過它不要求其依賴項也必須是嚴格的(即它是「區域性」嚴格的)。它沒有單獨的設定:它使用與 Flow Strict 相同的設定,只是沒有 nonstrict-import 規則。

一旦 @flow strict-local 檔案的所有依賴項都變為嚴格的,就可以將檔案升級為 @flow strict 檔案。@flow strict 檔案不能依賴 @flow strict-local 檔案,因為這會違反 nonstrict-import 規則。

未來展望

最終,Flow Strict 的一些功能可能會成為 Flow 的預設行為,如果這些功能證明成功並獲得廣泛採用。