1. ホーム
  2. タイプスクリプト

[解決済み】TypeScriptの関数のオーバーローディング

2022-03-26 07:45:18

質問

TypeScript言語仕様の6.3項では、関数のオーバーロードについて述べており、その実装方法について具体的な例を挙げています。 しかし、このようなことを試すと

export class LayerFactory { 

    constructor (public styleFactory: Symbology.StyleFactory) { }

    createFeatureLayer (userContext : Model.UserContext, mapWrapperObj : MapWrapperBase) : any {           
         throw "not implemented";
    }                 

    createFeatureLayer(layerName : string, style : any) : any {
        throw "not implemented";
     }        

}

関数のパラメータが異なる型であるにもかかわらず、識別子が重複しているというコンパイラーエラーが発生します。 2番目のcreateFeatureLayer関数にパラメータを追加しても、コンパイラーエラーが発生します。 アイデアをお願いします。

解決方法は?

これは、両方の関数がJavaScriptにコンパイルされたとき、そのシグネチャがまったく同じになるためと思われます。JavaScriptには型がないので、同じ数の引数を取る関数を2つ作ってしまうことになる。そこで、TypeScriptでは、このような関数を作らないように制限している。

TypeScriptは、パラメータの数に応じたオーバーロードをサポートしていますが、OO言語と比較すると、踏むべき手順が少し異なります。別のSOの質問に対する回答として、ある人が素敵な例で説明してくれています。 メソッドのオーバーロード? .

基本的には、TypeScriptがコンパイルエラーを出さないように、1つの関数といくつかの宣言を作成しています。このコードがJavaScriptにコンパイルされると、具象関数だけが見えるようになる。JavaScriptの関数は複数の引数を渡して呼び出すことができるため、そのまま動作します。