引数の型が合わないエラーの原因と直し方
関数やメソッドの引数に、パラメータの型と違う型の値を渡したときに出るエラーです。配列のpush()のような組み込みメソッドの引数でも同じ形式のエラーになります。
エラーメッセージの読み方
main.ts(4,19): error TS2345: Argument of type 'number' is not assignable to parameter of type 'string'.
main.ts- ファイル名
4- 行番号
19- 列番号 — この位置でtscが検査に失敗しました
TS2345- エラーコード — 検索するとTypeScriptの解説が見つかります
Argument of type 'number' is not assignable to parameter of type 'string'.- 内容 — 期待していたもの、または受け付けられなかったもの
このエラーが出る典型パターン
パターン1
1 function greet(name: string): string { 2 return "Hello, " + name; 3 } 4 console.log(greet(42 )); ^
greetはstring型の引数を期待しています。数値の42はそのままでは渡せません。
直し方: 42 を "Al" にします。
パターン2
1 const nums: number[] = [1, 2, 3]; 2 nums.push("4"); ^ 3 console.log(nums);
numsはnumber[]型なので、push()に渡せるのは数値だけです。文字列の"4"は追加できません。
直し方: "4" を 4 にします。
パターン3
1 function isEven(n: number): boolean { 2 return n % 2 === 0; 3 } 4 console.log(isEven("4")); ^
isEvenはnumber型の引数を期待しています。文字列の"4"は数値と見た目が似ていても別の型です。
直し方: "4" を 4 にします。
パターン4
1 function repeat(s: string): string { 2 return s + s; 3 } 4 console.log(repeat(7 )); ^
repeatはstring型の引数を期待しています。数値の7はそのままでは渡せません。
直し方: 7 を "hi" にします。
パターン5
1 const flags: boolean[] = [true, false]; 2 flags.push("true"); ^ 3 console.log(flags);
flagsはboolean[]型なので、push()に渡せるのは真偽値だけです。
直し方: "true" を true にします。
よくある誤解
「配列に型を付けても、実際に入れる値までは見ていないはず」という思い込みは誤りです。numbers.push("4")のように、typed配列へ違う型の要素を追加しようとした時点でエラーになります。
実務での勘所
push()のような組み込みメソッドの型チェックがどこから来るのかというと、TypeScript自身が同梱しているlib.d.tsという型定義ファイルに、Arrayクラスの各メソッドの型があらかじめ記述されているためです。number[]型の配列はArray<number>として扱われ、そのpushメソッドの型定義は(...items: number[]) => numberに具体化されます。自分で書いたコードでなくても、標準ライブラリの型定義が存在する限り、組み込みメソッドの引数も同じ精度でチェックされます。