TypeScriptには強力な型推論システムがあります。ほとんどの場合、変数、引数、および戻り値の型は、コンテキストに基づいて自動的に計算されます。型推論にはいくつかのレベルがあります:
例:
let a = 2; // number let b = [1, "a"]; // (number | string)[] window.addEventListener('click', e => { // e: MouseEvent });
制約:コンパイラが型を明確に推論できない場合 — 最も広い型を選択します(通常は any)、これにより型付けの利点を失います。
明示的に指定しない場合、関数の引数は型付けされるのでしょうか?しかし、その関数は型付けされた値と共に後で使用されます。
誤った答え: はい、TypeScriptは常に自動的に引数の型を「推測」します。
正しい答え: いいえ。関数のコンテキストに型情報が含まれている場合のみ、引数は型を取得します。それ以外の場合は any または他の基本型になり、エラーを引き起こす可能性があります。常に入力データを明示的に型付けすることが重要です。
例:
function f(x) { return x.toFixed(2); // エラー: xはany型 }
物語
プロジェクトでは、カスタムフックの戻り値の型を明示的に指定せず、TypeScriptはその型が
undefinedになり得ることを認識しませんでした。その結果、チェックなしでオブジェクトのメソッドを呼び出すと、ランタイムエラーが発生しました。
物語
異なる型の値を持つ配列を作成した際に、結果の型は自動的に
any[]と推論され、型が明示的に指定されなかったため、以降のコードで型付けの利点を失いました。
物語
サービスの入力パラメータのバリデーションは型付けされず、TypeScriptの「推測」に依存していました。コードベースのリファクタリング後、自動推論があまりにも一般的な型を返し、データ型に関するエラーがプロダクションに入り込んでしまいました。