TypeScriptで「この呼び出しに一致するオーバーロードはありません(ts2769)」というエラーが発生する主な原因として、最も適切なものはどれか?
解説
正解と要点正解は「関数やコンポーネントに渡している引数の型が、定義されたどのオーバーロードシグネチャとも一致していない」です。ts2769は、オーバーロードされた関数の呼び出し時に、渡した引数がどのシグネチャ(呼び出しパターン)にもマッチしなかった場合に発生するエラーです。なぜその答えなのかstrictモードの副作用という選択肢は誤りです。strictモードはstrictNullChecksやnoImplicitAnyなどを一括で有効にし型チェックを厳格にしますが、ts2769自体はstrictの有無に関係なく発生します。「ts2769 strict 関係」で調べる方もいますが、strictを無効にしてもこのエラーは解消しません。TypeScriptのバージョンが古いという選択肢も誤りです。オーバーロード構文はTypeScript初期から存在する基本機能であり、バージョンの古さが直接の原因になることは通常ありません。オーバーロードの数に上限があるという選択肢も誤りです。TypeScriptにオーバーロード数の上限はなく、何個定義しても構文エラーにはなりません。背景・仕組みTypeScriptのオーバーロードとは、1つの関数名に対して複数の呼び出しシグネチャを定義する仕組みです。コンパイラは上から順にシグネチャを照合し、いずれにも合致しないとts2769を報告します。// オーバーロードシグネチャ function greet(name: string): string; function greet(age: number): string; // 実装シグネチャ function greet(value: string | number): string { return typeof value === 'string' ? `Hello, ${value}` : `Age: ${value}`; } greet(true); // ts2769: どのオーバーロードにも一致しないエラーメッセージには「オーバーロード 1/2」「オーバーロード 2/2」のように、各シグネチャとの不一致理由が個別に表示されるため、末尾まで読むことがデバッグの鍵です。よくあるミスとエラー実務で最も多いのは、string | undefinedをstring型の引数に渡してしまうケースです。たとえばReactコンポーネントのpropsでオプショナルな値をそのまま渡すと発生します。// styled-componentsやReact.forwardRefなどで頻発 const name: string | undefined = getData(); // ts2769: string | undefined は string に割り当てられない someOverloadedFn(name); // 修正: undefinedを除外する if (name !== undefined) { someOverloadedFn(name); }もう一つ多いのが、ライブラリのバージョンアップ後に型定義が変更され、それまで通っていたコードが突然ts2769になるパターンです。@types/reactや@types/nodeのアップデート後は特に注意が必要です。実務での活用例エラーメッセージの読み方: ts2769が出たら、エラー末尾の各オーバーロードごとの不一致理由を確認する。最も近いシグネチャとの差分が修正のヒントになる型の絞り込み(Type Narrowing): if文や型ガードで引数の型を絞り込んでからオーバーロード関数に渡すことで、エラーを防げるライブラリ更新時の対策: package.jsonで@types/*のバージョンを固定し、意図しない型定義の変更を防ぐ。更新時はtsc --noEmitで事前に型チェックを実行する