Any
型チェッカーを使わずに済む方法を探している場合、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
が漏れることはありません。