メインコンテンツにスキップ

Flow Strict

ファイルに @flow strict を追加することで、Flow でより強力な安全性の保証(any/Object/Function 型の禁止や、すべての依存関係が型付けされていることの要求など)を有効にできます。

概要

Flow は導入が容易になるように設計されており、特定の状況では型チェックをオプトアウトして、安全でない動作を許可することができます。しかし、多くのコードベースで Flow 型の導入が進んだため、このトレードオフは覆される可能性があります。Flow Strict を使用すると、以前は許可されていた安全でないパターンを禁止できます。これにより、より多くのバグを捕捉し、リファクタリングを容易にする、より高い安全性の保証が得られます。そして、これらのより強力な保証を、ファイルごとに段階的に実装することができます。

機能

ファイルで Flow Strict を有効にすると、以前は許可されていたいくつかのパターンが Flow エラーを引き起こすようになります。禁止された各パターンには、エラーをトリガーする対応する Flow Lint ルールがあります。@flow strict で有効になるルールの一覧は、各 .flowconfig で構成されます。以下に推奨されるルールを示します。

  • nonstrict-import@flow strict でもないモジュールからインポートするときにエラーをトリガーします。これは非常に重要です。なぜなら、ファイルが strict としてマークされている場合、そのすべての依存関係も strict である必要があるからです。
  • unclear-type:型注釈で ObjectFunction、または any を使用するとエラーをトリガーします。
  • untyped-import:型付けされていないモジュールからインポートするときにエラーをトリガーします。
  • untyped-type-import:型付けされていないモジュールから型をインポートするときにエラーをトリガーします。
  • unsafe-getters-setters:安全でない可能性があるゲッターとセッターを使用するとエラーをトリガーします。
  • sketchy-null:null/undefined または falsy の可能性がある値に対して存在チェックを行うとエラーをトリガーします。

利用可能な lint ルールの一覧については、Lint ルールリファレンスを参照してください。

さらに、関数のパラメーターは const とみなされる(つまり、let ではなく const で宣言されたかのように扱われる)ことに注意してください。この機能は Flow Strict でまだ設定可能ではありません。常にオンになっています。

.flowconfig で Flow Strict を有効にする

Flow Strict は各 .flowconfig で構成されます。有効にするには

  1. .flowconfig[strict] セクションを追加します。
  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 を無効にする必要があったとしても、少なくともその間に安全でない動作が追加されるのを防ぐことができました。

ライブラリの定義は strict であるとみなされます(さまざまな strict 構成を持つ多くの異なるプロジェクトに含めることができるため)。

Strict Local

Flow Strict 構成で nonstrict-import ルールを有効にすると(推奨)、strict ファイルのすべての依存関係も strict である必要があります。これが最適な目標ですが、大規模な既存のコードベースでは、すべての依存関係が strict になる前に、Flow Strict の利点をいくつか利用できるようにすることが有益な場合があります。

@flow strict-local@flow strict と同じですが、依存関係も strict である必要はありません(つまり、「ローカルで」strict です)。個別の構成はありません。Flow Strict と同じ構成を使用しますが、nonstrict-import ルールは使用しません。

@flow strict-local ファイルのすべての依存関係が strict になったら、ファイルは @flow strict ファイルにアップグレードできます。@flow strict ファイルは、nonstrict-import ルールを破るため、@flow strict-local ファイルに依存することはできません。

今後の展望

最終的に、Flow Strict の一部の機能が成功し、広く採用されれば、Flow のデフォルトの動作になる可能性があります。