TypeScriptで関数呼び出し時に「TS2345: Argument of type 'string' is not assignable to parameter of type 'number'.」が発生する原因として正しいものはどれか?
解説
正解と要点正解は「number型の引数にstring型の値を渡しているため」です。TS2345は関数の引数に期待される型と、実際に渡された値の型が一致しないときに発生するエラーです。なぜその答えなのかエラーメッセージを分解すると、Argument of type 'string'(渡した値がstring)がparameter of type 'number'(仮引数がnumber)に代入できない、と読めます。つまり、関数側がnumberを要求しているのに、呼び出し側がstringを渡していることが直接の原因です。「戻り値の型が合わない」場合はTS2345ではなくTS2322など別のエラーコードになります。「constかletか」は変数の再代入可否に関わるだけで、型の不一致とは無関係です。「ジェネリクスの有無」も型引数の柔軟性に関わる話であり、このエラーの直接原因ではありません。背景・仕組みTypeScriptは構造的型システム(Structural Type System)を採用しており、コンパイル時に型の整合性を検査します。TS2345はその中でも最も頻出するエラーの一つで、関数呼び出し時の実引数と仮引数の型が合わないときに報告されます。たとえば以下のようなコードで発生します。function double(n: number): number { return n * 2; } const input = "42"; // string型 double(input); // TS2345エラーJavaScriptでは暗黙の型変換により"42" * 2が84になりますが、TypeScriptはこのような暗黙変換を許容しません。これは実行時バグを未然に防ぐための設計です。実務での活用例このエラーが頻発するのは、具体的には以下のような場面です。フォーム入力値の処理 — input.valueは常にstringなので、数値として扱う関数に渡す前にNumber()やparseInt()で変換が必要です。APIレスポンスの利用 — JSONパース後の値がunknownやstringになっているケースでは、型ガードやバリデーションライブラリ(zodなど)で型を絞り込んでから渡すのがベストプラクティスです。URLパラメータの取得 — searchParams.get()の戻り値はstring | nullなので、number引数にそのまま渡すとTS2345になります。対処の基本は「渡す前に明示的に型変換または型ガードを行う」ことです。as numberのような型アサーションで黙らせるのではなく、実行時の安全性も担保する変換処理を書く習慣が重要です。