Code Fix

初級

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));
                      ^
main.ts(4,23): error TS2554: Expected 2 arguments, but got 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")         );
                          ^
main.ts(4,13): error TS2554: Expected 2 arguments, but got 1.

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));
                         ^
main.ts(4,29): error TS2554: Expected 2 arguments, but got 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));
                        ^
main.ts(4,28): error TS2554: Expected 2 arguments, but got 3.

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")     );
                       ^
main.ts(4,13): error TS2554: Expected 2 arguments, but got 1.

labelは2つの引数が必須です。1つしか渡していないためエラーになります。

直し方: label("x") を label("x", "y") にします。

この問題を解いてみる →

よくある誤解

「JavaScriptは引数の数が合わなくても動く」という経験があると、TypeScriptでも同じだと思いがちです。型定義がある関数呼び出しでは、引数の数もチェック対象になります。

実務での勘所

引数を省略可能にする方法には、オプショナル引数(b?: number)とデフォルト引数(b: number = 0)の2種類があり、似ていますが意味が違います。オプショナル引数は関数の中でb: number | undefinedとして扱われ、使う前にundefinedかどうかの確認が必要になることがあります。デフォルト引数は省略された場合に既定値がその場で代入されるため、関数の中では常に本来の型として安全に使えます。「省略できればよい」だけならオプショナル引数、「省略時も具体的な値がほしい」ならデフォルト引数が適しています。

演習をはじめる

関連するエラー

広告
広告スロット(未設定)