メインコンテンツまでスキップ

関数の引数 (function parameter)

引数の個数

JavaScriptの関数では、関数が期待する引数の個数と、関数を呼び出した際に渡した引数の数が一致していなくても、関数が呼び出せます。つまり、JavaScriptは引数のチェックを行わないということです。たとえば、引数が1つ渡されることを期待する関数を、引数2つで呼び出してもエラーになりません。

js
function increment(n) {
return n + 1;
}
increment(1, 2); // OK
js
function increment(n) {
return n + 1;
}
increment(1, 2); // OK

逆に、JavaScriptでは、引数が少ない場合であっても関数が実行されます。その際、渡されなかった引数の値はundefinedになります。

js
function foo(a, b) {
console.log(b);
}
foo(1); // 引数が足りない
undefined
js
function foo(a, b) {
console.log(b);
}
foo(1); // 引数が足りない
undefined

基本的に引数が多く渡される分には、関数の実行が問題になることはありません。余分な引数は無視してしまえばよいからです。それでも、引数の個数を厳密にチェックしたいケースでは、変数argumentslengthプロパティで引数の数をチェックします。

js
function foo(a, b) {
if (arguments.length > 2) {
throw new Error("引数の数は2つまでです");
}
}
foo(1, 2); // OK
foo(1, 2, 3); // エラー
js
function foo(a, b) {
if (arguments.length > 2) {
throw new Error("引数の数は2つまでです");
}
}
foo(1, 2); // OK
foo(1, 2, 3); // エラー

JavaScriptでは、上のように引数の数をチェックするには、そのためのロジックを書く必要があります。

TypeScriptでは、関数の引数の数が一致していないとコンパイルエラーになります。

ts
function increment(n) {
return n + 1;
}
increment(1, 2); // 引数が多い
Expected 1 arguments, but got 2.2554Expected 1 arguments, but got 2.
increment(); // 引数が足りない
Expected 1 arguments, but got 0.2554Expected 1 arguments, but got 0.
ts
function increment(n) {
return n + 1;
}
increment(1, 2); // 引数が多い
Expected 1 arguments, but got 2.2554Expected 1 arguments, but got 2.
increment(); // 引数が足りない
Expected 1 arguments, but got 0.2554Expected 1 arguments, but got 0.

そのため、TypeScriptではJavaScriptのようにチェックロジックを書く必要はありません。

引数の型

JavaScriptは、引数の型についてもチェックを行いません。JavaやPHPなどの他のプログラミング言語の中には、関数の引数の型を定義することで、関数が期待する引数の型と異なる値が渡されたときに、関数実行前にエラーにしてくれる言語があります。JavaScriptにはこのような機能がありません。たとえば、文字列型の引数を期待する関数に、null型の値を渡しても、JavaScriptの関数は実行されます。

js
function len(str) {
return str.length;
}
console.log(len(null));
js
function len(str) {
return str.length;
}
console.log(len(null));

この関数lenの引数strは文字列型であることを想定していますが、渡される値はnullです。それでも、関数の実行自体は行われ、nullに存在しないlengthプロパティへの参照を試みる段階でやっとエラーになります。

JavaScriptでは、引数の型を厳密にする場合、チェック処理を書く必要があります。たとえば、引数が数値型や文字列型などのプリミティブ型かのチェックはこのtypeof演算子を使って行います。

js
function len(str) {
if (typeof str !== "string") {
throw new Error("strは文字列型にしてください");
}
return str.length;
}
len("a"); // OK
len(1); // エラー
js
function len(str) {
if (typeof str !== "string") {
throw new Error("strは文字列型にしてください");
}
return str.length;
}
len("a"); // OK
len(1); // エラー

TypeScriptでは、関数の引数に型注釈が書けます。型注釈を書いておくと、引数に意図しない型を書くとコンパイルエラーになります。

ts
function len(str: string) {
return str.length;
}
len("a"); // OK
len(1); // エラー
Argument of type 'number' is not assignable to parameter of type 'string'.2345Argument of type 'number' is not assignable to parameter of type 'string'.
ts
function len(str: string) {
return str.length;
}
len("a"); // OK
len(1); // エラー
Argument of type 'number' is not assignable to parameter of type 'string'.2345Argument of type 'number' is not assignable to parameter of type 'string'.

そのため、TypeScriptではJavaScriptのように型チェックの処理を書く必要はありません。

  • 質問する ─ 読んでも分からなかったこと、TypeScriptで分からないこと、お気軽にGitHubまで🙂
  • 問題を報告する ─ 文章やサンプルコードなどの誤植はお知らせください。