Expected N arguments, but got M の原因と直し方
関数に定義されているパラメータの数と違う数の引数を渡して呼び出したときに出るエラーです。JavaScriptでは引数が多すぎても少なすぎても実行できてしまいますが、TypeScriptは呼び出し時点で検出します。
エラーメッセージの読み方
main.ts(4,23): error TS2554: Expected 2 arguments, but got 3.
main.ts- ファイル名
4- 行番号
23- 列番号 — この位置でtscが検査に失敗しました
TS2554- エラーコード — 検索するとTypeScriptの解説が見つかります
Expected 2 arguments, but got 3.- 内容 — 期待していたもの、または受け付けられなかったもの
このエラーが出る典型パターン
パターン1
1 function add(a: number, b: number): number { 2 return a + b; 3 } 4 console.log(add(1, 2, 3)); ^
addは2つの引数しか受け取りません。3つ渡すと引数の数が合わずエラーになります。
直し方: add(1, 2, 3) を add(1, 2) にします。
パターン2
1 function greet(name: string, greeting: string): string { 2 return greeting + ", " + name; 3 } 4 console.log(greet("Al") ); ^
greetは2つの引数が必須です。1つしか渡していないため呼び出せません。
直し方: greet("Al") を greet("Al", "Hello") にします。
パターン3
1 function makePoint(x: number, y: number): string { 2 return `(${x}, ${y})`; 3 } 4 console.log(makePoint(1, 2, 3)); ^
makePointは2引数の関数です。余分な3つ目の引数を渡すとエラーになります。
直し方: makePoint(1, 2, 3) を makePoint(1, 2) にします。
パターン4
1 function multiply(a: number, b: number): number { 2 return a * b; 3 } 4 console.log(multiply(2, 3, 4)); ^
multiplyは2つの引数しか受け取りません。3つ渡すとエラーになります。
直し方: multiply(2, 3, 4) を multiply(2, 3) にします。
パターン5
1 function label(name: string, tag: string): string { 2 return name + tag; 3 } 4 console.log(label("x") ); ^
labelは2つの引数が必須です。1つしか渡していないためエラーになります。
直し方: label("x") を label("x", "y") にします。
よくある誤解
「JavaScriptは引数の数が合わなくても動く」という経験があると、TypeScriptでも同じだと思いがちです。型定義がある関数呼び出しでは、引数の数もチェック対象になります。
実務での勘所
引数を省略可能にする方法には、オプショナル引数(b?: number)とデフォルト引数(b: number = 0)の2種類があり、似ていますが意味が違います。オプショナル引数は関数の中でb: number | undefinedとして扱われ、使う前にundefinedかどうかの確認が必要になることがあります。デフォルト引数は省略された場合に既定値がその場で代入されるため、関数の中では常に本来の型として安全に使えます。「省略できればよい」だけならオプショナル引数、「省略時も具体的な値がほしい」ならデフォルト引数が適しています。