演習 - 関数型を定義する
関数型を定義した後、関数を作成するときにそれを使うことができます。 この設計は、同じ関数型のシグネチャを複数の関数に適用する場合に便利です。
型のエイリアスまたはインターフェイスを使用して、関数型を定義できます。 どちらの方法も基本的に同じように動作するので、どちらを使用するかはユーザー次第です。 関数型を拡張できるようにしたい場合は、インターフェイスの方が適しています。 型のエイリアスは、共用体またはタプルを使用する場合に適しています。
渡されたパラメーターの値に応じて、足し算または引き算を実行する関数を作成しましょう。 加算と減算の両方の演算で、x
と y
の 2 つの数値を受け取り、結果を数値として返します。
プレイグラウンドを開き、既存のコードがあれば削除します。
型のエイリアスを使用して、
calculator
という名前の関数型を定義します。 型シグネチャでは、パラメーター リスト(x: number, y: number)
と戻り値number
が、アロー (=>
) 演算子で区切られています。 (型シグネチャの構文は、アロー関数と同じであることに注意してください)。type calculator = (x: number, y: number) => number;
これで、関数を宣言するときに、型シグネチャとして関数型を使用できるようになります。 関数型
calculator
の 2 つの変数を宣言します。1 つは加算演算用で、もう 1 つは減算演算用です。 それぞれの結果をコンソールに返すことで、新しい関数をテストします。let addNumbers: calculator = (x: number, y: number): number => x + y; let subtractNumbers: calculator = (x: number, y: number): number => x - y; console.log(addNumbers(1, 2)); console.log(subtractNumbers(1, 2));
また、
calculator
関数型を使用して、別の関数から値を渡すこともできます。doCalculation
関数を入力します。この関数は、operation
パラメーターに渡された値に基づいて、addNumbers
関数またはsubtractNumbers
関数の結果を返します。let doCalculation = (operation: 'add' | 'subtract'): calculator => { if (operation === 'add') { return addNumbers; } else { return subtractNumbers; } }
「
console.log(doCalculation('add')(1, 2))
」と入力して関数を実行してみます。doCalculation
およびcalculator
で定義されている型に基づいて、TypeScript で Intellisense のヘルプが提供されることがわかります。次に、
calculator
関数型をコメントアウトし、インターフェイスを使用して新しい型を宣言します。 型シグネチャが少し異なることに注意してください。パラメーター リストと戻り値の型は、アロー演算子ではなく、コロン (:
) で区切ります。 変数の宣言で、calculator
関数をCalculator
インターフェイスに置き換えます。 それが済むと、コードは同じように動作します。// type calculator = (x: number, y: number) => number; interface Calculator { (x: number, y: number): number; }
関数型の推定
関数を定義する場合、関数のパラメーターの名前は、関数型での名前と一致する必要はありません。 両方の場所の型シグネチャでパラメーターの名前を指定する必要がありますが、2 つの関数型に互換性があるかどうかをチェックするときに、名前は無視されます。
また、パラメーターの型と戻り値の型を省略することもできます。これらの型は、TypeScript によって関数型の定義から推定されます。
TypeScript に関しては、これら 3 つのステートメントは同じものです。
let addNumbers: Calculator = (x: number, y: number): number => x + y;
let addNumbers: Calculator = (number1: number, number2: number): number => number1 + number2;
let addNumbers: Calculator = (num1, num2) => num1 + num2;