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
:在型別註解中使用Object
、Function
或any
時觸發錯誤。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
中設定。如要啟用
- 將
[strict]
區段新增至.flowconfig
。 - 列出要啟用的 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 的預設行為,如果這些功能證明成功並獲得廣泛採用。