Programmingフロントエンド開発者 / フルスタック開発者

TypeScriptにおける型推論システムはどのように機能しますか?型推論のレベルにはどのようなものがあり、コンパイラの「知恵」に依存することでどのようなエラーを犯す可能性がありますか?

Hintsage AIアシスタントで面接を突破

回答

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の「推測」に依存していました。コードベースのリファクタリング後、自動推論があまりにも一般的な型を返し、データ型に関するエラーがプロダクションに入り込んでしまいました。