投稿日:2020年12月16日
まずはシンプルな関数を書いてみます。
function add(a: number, b: number): number {
return a + b;
}
console.log(add(1, 2));
関数でも引数と返り値の型を推論させることができます。
ただし引数については、型を一意に正しく推論させることが困難であるため明示的に指定するのが一般的です。
上の様に定義した関数を名前付き関数といいます。
TypeScriptには名前付き関数の他にいくつかの関数の宣言方法があります。
// 名前付き関数
function greet1(name: string): string {
let greeting = `Hello ${name}`;
console.log(this);
return greeting;
}
greet1("marsquai");
// 無名関数
let greet2 = function (name: string): string {
let greeting = `Hello ${name}`;
return greeting;
};
greet2("marsquai");
// アロー関数
let greet3 = (name: string): string => {
let greeting = `Hello ${name}`;
return greeting;
};
greet3("marsquai");
// アロー関数(省略記法)
let greet4 = (name: string) => `Hello ${name}`;
greet4("marsquai");
// 関数コンストラクタ(非推奨)
let greet5 = new Function("name", "return `Hello ${name}`");
greet5("marsquai");
アロー関数は自身がthisを持たないため、classのメソッドでthisを使いたい場合などに便利です。
Functionコンストラクタは非常に多くの問題を抱えているため、滅多なことでない限り使用は控えましょう。
関数の引数は?を使って省略可能にすることができます。
省略可能引数は必須パラメータの後に設定する必要があります。
その関数で引数を省略した場合、対象の引数にはundefinedが入ります。
function greet(firstName: string, lastName?: string) {
console.log(`Hello ${firstName}${lastName ? lastName : ""}!!`);
}
greet("mars");
greet("mars", "quai");
関数の引数にはデフォルト値を設定することができます。
function greet(name: string = "ななしさん") {
console.log(name);
}
greet();
TypeScriptでは可変長引数を定義する場合RestParameterを使います。
(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/rest_parameters)
RestParameterは関数の最後の引数に...を付けます。RestParameterになれるのは最後の引数だけで、2つ以上指定することはできません。
function greetAndAdd(name: string, ...nums: number[]): number {
console.log(`Hello ${name}`);
return nums.reduce((a, b) => a + b);
}
console.log(greetAndAdd("marsquai", 1, 2, 3, 4, 5, 6));
可変長引数はargumentsという取得方法でも実装することはできますが、その方法の場合型チェックなどが行われず危険なので、できる限りRestParameterを使いましょう。