質問

TQUISTLIPT言語でメソッドの過負荷をする方法はありますか?

このようなものを達成したい:

class TestClass {
    someMethod(stringParameter: string): void {
        alert("Variant #1: stringParameter = " + stringParameter);
    }

    someMethod(numberParameter: number, stringParameter: string): void {
        alert("Variant #2: numberParameter = " + numberParameter + ", stringParameter = " + stringParameter);
    }
}

var testClass = new TestClass();
testClass.someMethod("string for v#1");
testClass.someMethod(12345, "string for v#2");
.

これは私がやりたくないものの例です(私はJSでハックのオーバーロードの部分を本当に嫌い):

class TestClass {
    private someMethod_Overload_string(stringParameter: string): void {
        // A lot of code could be here... I don't want to mix it with switch or if statement in general function
        alert("Variant #1: stringParameter = " + stringParameter);
    }

    private someMethod_Overload_number_string(numberParameter: number, stringParameter: string): void {
        alert("Variant #2: numberParameter = " + numberParameter + ", stringParameter = " + stringParameter);
    }

    private someMethod_Overload_string_number(stringParameter: string, numberParameter: number): void {
        alert("Variant #3: stringParameter = " + stringParameter + ", numberParameter = " + numberParameter);
    }

    public someMethod(stringParameter: string): void;
    public someMethod(numberParameter: number, stringParameter: string): void;
    public someMethod(stringParameter: string, numberParameter: number): void;

    public someMethod(): void {
        switch (arguments.length) {
        case 1:
            if(typeof arguments[0] == "string") {
                this.someMethod_Overload_string(arguments[0]);
                return;
            }
            return; // Unreachable area for this case, unnecessary return statement
        case 2:
            if ((typeof arguments[0] == "number") &&
                (typeof arguments[1] == "string")) {
                this.someMethod_Overload_number_string(arguments[0], arguments[1]);
            }
            else if ((typeof arguments[0] == "string") &&
                     (typeof arguments[1] == "number")) {
                this.someMethod_Overload_string_number(arguments[0], arguments[1]);
            }
            return; // Unreachable area for this case, unnecessary return statement
        }
    }
}


var testClass = new TestClass();
testClass.someMethod("string for v#1");
testClass.someMethod(12345, "string for v#2");
testClass.someMethod("string for v#3", 54321);
.

役に立ちましたか?

解決

仕様によると、TypeScriptはメソッドのオーバーロードをサポートしていますが、それはかなり厄介であり、多くの手動作業チェックタイプのパラメータをチェックします。私はそれが普通のJavaScriptでメソッドの過負荷に到達することができる最も近いものであり、そのチェックも含まれていてTypeScriptは実際のメソッド本体を変更しないようにすると、不必要なランタイムパフォーマンスコストを避けることを試みるためです。

正しく理解した場合は、最初にオーバーロードのそれぞれのメソッド宣言を作成し、次に 1 メソッド実装で、その引数をチェックしてどのオーバーロードが呼び出されたかを決定する必要があります。実装の署名はすべてのオーバーロードと互換性がある必要があります。

class TestClass {
    someMethod(stringParameter: string): void;
    someMethod(numberParameter: number, stringParameter: string): void;

    someMethod(stringOrNumberParameter: any, stringParameter?: string): void {
        if (stringOrNumberParameter && typeof stringOrNumberParameter == "number")
            alert("Variant #2: numberParameter = " + stringOrNumberParameter + ", stringParameter = " + stringParameter);
        else
            alert("Variant #1: stringParameter = " + stringOrNumberParameter);
    }
}
.

他のヒント

明確にするための

更新。 TypeScriptのメソッドのオーバーロードは、表現する必要があるAPIを使用して既存のライブラリの型定義を作成できるように、便利な機能です。

あなた自身のコードを書くときは、あなたはオプションまたはデフォルトのパラメータを使用して過負荷の認知的なオーバーヘッドを回避することができるかもしれません。これはメソッドのオーバーロードのためのより読みやすい代替手段であり、意図的な順序付けの過負荷の作成を避けるので、あなたのAPIを正直に保ちます。

Tysscriptオーバーロードの一般的な法則は次のとおりです。

あなたができるならばオーバーロードシグネチャとすべてのテストパスを削除すると、TypesScriptオーバーロード は必要ありません。

通常、オプション、またはデフォルトのパラメータ - または共用型の種類、またはオブジェクトの向きを持つものと同じことを実現できます。

実際の質問

実際の質問は以下の過負荷を要求します。

someMethod(stringParameter: string): void {

someMethod(numberParameter: number, stringParameter: string): void {
.

別の実装で過負荷をサポートする言語でも(注:TypesScriptオーバーロード単一の実装を共有する) - プログラマーは順序付けの一貫性を提供するためのアドバイスです。これは署名を作るでしょう:

someMethod(stringParameter: string): void {

someMethod(stringParameter: string, numberParameter: number): void {
.

stringParameterは常に必要なので、まず進みます。これを作業スクリプトスクリプトオーバーロードとして書くことができます:

someMethod(stringParameter: string): void;
someMethod(stringParameter: string, numberParameter: number): void;
someMethod(stringParameter: string, numberParameter?: number): void {
    if (numberParameter != null) {
        // The number parameter is present...
    }
}
.

しかし、タイプスクリプトの過負荷の法則に続いて、過負荷署名を削除し、私たちのすべてのテストはまだ通過します。

someMethod(stringParameter: string, numberParameter?: number): void {
    if (numberParameter != null) {
        // The number parameter is present...
    }
}
.

実際の質問、実際の順序

元の注文で持続することを決心した場合、オーバーロードは次のようになります。

someMethod(stringParameter: string): void;
someMethod(numberParameter: number, stringParameter: string): void;
someMethod(a: string | number, b?: string | number): void {
  let stringParameter: string;
  let numberParameter: number;

  if (typeof a === 'string') {
    stringParameter = a;
  } else {
    numberParameter = a;

    if (typeof b === 'string') {
      stringParameter = b;
    }
  }
}
.

今すぐパラメータを入れる場所を解決するための分岐はたくさんありますが、あなたがこれを読んでいるのであればこの命令を守りたいと思った。 / P>

someMethod(a: string | number, b?: string | number): void {
  let stringParameter: string;
  let numberParameter: number;

  if (typeof a === 'string') {
    stringParameter = a;
  } else {
    numberParameter = a;

    if (typeof b === 'string') {
      stringParameter = b;
    }
  }
}
.

既に既に もちろん、私たちがする必要があるタイプチェックの量を考えると、最もよい答えは単に2つの方法を持つことです:
someMethod(stringParameter: string): void {
  this.someOtherMethod(0, stringParameter);
}

someOtherMethod(numberParameter: number, stringParameter: string): void {
  //...
}
.

私は望みます。この機能も欲しいが、タイプスクリプトは、オーバーロードされたメソッドを持たないuntyped javascriptと相互運用可能である必要があります。すなわち、オーバーロードされたメソッドがJavaScriptから呼び出される場合は、1つのメソッド実装にのみ送出できます。

CodePlexに関するいくつかの関連議論があります。例えば

https://typescript.codeplex.com/workitem/617

私はまだTypeScriptがすべてのIFのすべてのIFのすべてのものを生成する必要があるので、それをする必要はないだろうと思います。

オプションのプロパティ定義インタフェース関数引数

この質問の場合、いくつかのオプションプロパティで定義されたインラインインタフェースを使用すると、以下のようなコードを直接行うことができます。

class TestClass {

    someMethod(arg: { stringParameter: string, numberParameter?: number }): void {
        let numberParameterMsg = "Variant #1:";
        if (arg.numberParameter) {
            numberParameterMsg = `Variant #2: numberParameter = ${arg.numberParameter},`;
        }
        alert(`${numberParameterMsg} stringParameter = ${arg.stringParameter}`);
    }
}

var testClass = new TestClass();
testClass.someMethod({ stringParameter: "string for v#1" });
testClass.someMethod({ numberParameter: 12345, stringParameter: "string for v#2" });
.

Tysscriptで提供されるオーバーロードは、他の静的言語のように対応する実装コードをサポートすることなく、関数の異なる署名のリストだけです。そのため、実装はまだ1つの関数本体で行われなければなりません。これは、実際の過負荷機能をサポートするそのような言語が快適ではなく、タイプスクリプトでの機能過負荷の使用を快適にしています。

しかし、匿名のプログラミング言語では利用できないTysscriptでは、レガシー機能の過負荷から快適なゾーンを満たすためのそのようなアプローチであるTysscriptでは、依然として多くの新規で便利なものがあります。 。

JavaScriptにはオーバーロードの概念がありません。TypesScriptはC#またはJavaではありません。

しかし、あなたはTypeScriptで過負荷を実装することができます。

この投稿を読む http://www.gyanparkash.in/function-overloading-in-typescript/-typescript// a>

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top