フローカバレッジ
coverageコマンドは、Flowがコードの各部分に対して実行したチェック量の指標を提供します。Flowカバレッジの高いプログラムは、Flowが潜在的なランタイムエラーを検出したという自信を高めるはずです。
これを決定する要因は、各式の推論された型にany
が存在するかどうかです。推論された型がany
である式はカバレッジされていないと見なされ、それ以外の場合はカバレッジされていると見なされます。
Flowの有効性を判断するためにこのメトリックが選択された理由を確認するには、次の例を考えてみましょう。
1const one: any = 1;2one();
このコードは、数値に対して呼び出しを実行しようとしているため、ランタイム型エラーにつながります。ただし、変数one
をany
としてアノテーションしているので、Flowはここでエラーをフラグしません。any
が関係するとFlowのチェックは事実上オフになるため、呼び出しは黙って許可されます。この安全でない型の使用により、型チェッカーは効果がなくなりました。カバレッジメトリックは、one
のすべてのインスタンスをカバレッジされていないものとして報告することで、これを表面化します。
設計空間
どの型を「カバレッジされている」とすべきか?
上記で説明したのは、カバレッジを決定するためのかなり粗い方法です。たとえば、Array<any>
のように、型の一部にany
が含まれている場合に式をカバレッジされていないものとしてフラグする基準を想像することができます。このようなメトリックには価値がありますが、型の「カバレッジされていない」部分は、通常、この型の値に対するさまざまな操作を通じてカバレッジされていないことが明らかになります。たとえば、次のコードでは
1declare const arr: Array<any>;2arr.forEach(x => {});
パラメータx
はカバレッジされていないものとしてフラグされます。また、実際には、このような厳密な基準はノイズが多すぎて、オンザフライで計算するにはコストがかかりすぎます。
共用体型
この原則の例外は共用体型です。型number | any
は、技術的にはany
がトップレベルのコンストラクターではない場合でも、カバレッジされていないと見なされます。共用体は、他の型のセットの中から選択肢をエンコードするだけです。その意味で、式の少なくとも1つの可能な型がチェックを制限する場合、その式を保守的にカバレッジされていないと見なしています。たとえば、次のコードでは
1let x: number | any = 1;2x = "a";
Flowではx
に何でも代入できます。これは、x
を数値として使用することの信頼性を低下させます。したがって、x
はカバレッジされていないと見なされます。
空の型
カバレッジの観点から興味深い型は、empty
型です。この型はおおよそデッドコードに対応します。そのため、型empty
の式周辺のチェックはより緩やかですが、それには正当な理由があります。このコードはランタイムに実行されません。このようなコードをクリーンアップするのが一般的であるため、Flowカバレッジは、型がempty
と推論されるコードも報告しますが、any
の場合とは区別します。
コマンドラインの使用
次の内容のファイルfoo.jsのカバレッジを確認するには
1function add(one: any, two: any): number {2 return one + two;3}4
5add(1, 2);
次のコマンドを実行できます
$ flow coverage file.js
Covered: 50.00% (5 of 10 expressions)
この出力は、このプログラムの10個のノードのうち5個がany
型と推論されたことを意味します。カバレッジされていない部分が正確にどこにあるかを確認するには、次のフラグのいずれかを渡すこともできます。
--color
:カバレッジされていない場所が赤色で表示されたfoo.jsが端末に出力されます。例:flow coverage --color file.js
--json
:"uncovered_locs"
タグの下に、カバレッジされていないすべての場所の範囲がリストされます。例:flow coverage --json file.js
最後に、デッドコードの例として、次のコードを考えてみましょう。
1function f(x: 'a' | 'b') {2 if (x === 'a') {3 // ...4 } else if (x === 'b') {5 // ...6 } else {7 x;8 }9}
共用体の両方のメンバーをすでにチェックしているので、最後のelse
句に到達することはありません。このため、x
はそのブランチでempty
型と推論されます。
このコマンドのカラーバージョンでは、これらの部分は青色で表示され、JSONバージョンでは"empty_locs"
フィールドの下に表示されます。
複数のファイルでの使用
複数のファイルのカバレッジを一度にチェックしたい場合、Flowはbatch-coverage
コマンドを提供します
$ flow batch-coverage dir/
は、dir/
の下にある各ファイルのカバレッジ統計と集計結果を報告します。
batch-coverage
には、遅延のないFlowサーバーが必要であることに注意してください。