関数

オーバーロード

このエントリーをはてなブックマークに追加
最終更新日 2016-12-31

TypeScript は関数のオーバーロードをサポートしているため、引数や戻り値が異なる、同じ名前の関数を宣言することができます。 次に示すのは、関数のオーバーロードの例です。

function foo(x: number): number;              // オーバーロードされた関数のシグネチャ 1
function foo(x: number, y: boolean): number;  // オーバーロードされた関数のシグネチャ 2
function foo(x: string): string;              // オーバーロードされた関数のシグネチャ 3

// オーバーロードされた関数の実装
function foo(x: any, y?: boolean): any {
    if (typeof x === "number") {
        
    } else {
        
    }
}

// オーバーロードされた関数の呼び出し例
var result1: number = foo(123);
var result2: number = foo(123, true);
var result3: string = foo("TypeScript");

TypeScript の関数のオーバーロードでは、始めにオーバーロードされた関数のシグネチャを宣言し、 最後にすべてのシグネチャに対応する関数の実装を宣言します。

今回の例では 3 種類のオーバーロードされた関数のシグネチャを用意し、 関数の実装では、引数が 1 つのシグネチャが使用された場合でも引数が 2 つのシグネチャが使用された場合でも動作するように、 第 2 引数 y をオプション引数にします。 第 1 引数 x はシグネチャによって Number 型の場合も String 型の場合もあるため、型注釈は Any 型とし、 typeof などで型を確認してから各シグネチャに対応する処理に振り分けます。 戻り値もシグネチャによって Number 型の場合も String 型の場合もあるため、戻り値の型注釈は Any 型とします。

このように、TypeScript の関数のオーバーロードは、1 つの関数の実装で複数のオーバーロードに対応する仕様となっています。