演習 - 関数型を定義する

完了

関数型を定義した後、関数を作成するときにそれを使うことができます。 この設計は、同じ関数型のシグネチャを複数の関数に適用する場合に便利です。

型のエイリアスまたはインターフェイスを使用して、関数型を定義できます。 どちらの方法も基本的に同じように動作するので、どちらを使用するかはユーザー次第です。 関数型を拡張できるようにしたい場合は、インターフェイスの方が適しています。 型のエイリアスは、共用体またはタプルを使用する場合に適しています。

渡されたパラメーターの値に応じて、足し算または引き算を実行する関数を作成しましょう。 加算と減算の両方の演算で、xy の 2 つの数値を受け取り、結果を数値として返します。

  1. プレイグラウンドを開き、既存のコードがあれば削除します。

  2. 型のエイリアスを使用して、calculator という名前の関数型を定義します。 型シグネチャでは、パラメーター リスト (x: number, y: number) と戻り値 number が、アロー (=>) 演算子で区切られています。 (型シグネチャの構文は、アロー関数と同じであることに注意してください)。

    type calculator = (x: number, y: number) => number;
    
  3. これで、関数を宣言するときに、型シグネチャとして関数型を使用できるようになります。 関数型 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));
    
  4. また、calculator 関数型を使用して、別の関数から値を渡すこともできます。 doCalculation 関数を入力します。この関数は、operation パラメーターに渡された値に基づいて、addNumbers 関数または subtractNumbers 関数の結果を返します。

    let doCalculation = (operation: 'add' | 'subtract'): calculator => {
        if (operation === 'add') {
            return addNumbers;
        } else {
            return subtractNumbers;
        }
    }
    
  5. console.log(doCalculation('add')(1, 2))」と入力して関数を実行してみます。doCalculation および calculator で定義されている型に基づいて、TypeScript で Intellisense のヘルプが提供されることがわかります。

  6. 次に、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;