4

異なるプロトタイプを持つ複数のコンストラクターをサポートしていないことを考慮して、TypeScriptでいくつかのクラス設計を実装するのに苦労しています。基本的に、いくつかのパラメーターを受け取るパブリックコンストラクターと「内部」コンストラクター(ライブラリ内でのみ使用される)を使用してクラスを設計したいと思います。パブリックコンストラクターは内部コンストラクターを呼び出します。C#では、次のようになります。

public class Class1
{
    internal Class1(int id)
    { 
    }

    public Class1(string s)
        : this(s.Length)
    {
    }
}

これをTypeScriptに変換する方法はありますか?

前もって感謝します!

4

3 に答える 3

4

これも同様に機能し、おそらくオリジナルに近いです。

class Class1 {

    id:number;

    constructor(s: string) {
        (n:number) => {
            this.id = n;
        }(s.length)
    }
}

var t:Class1 = new Class1("HELLO");
console.log("Class1ID: " + t.id); // Output = Class1 ID: 5

参考までに、出力 JS を次に示します。

var Class1 = (function () {
    function Class1(s) {
        var _this = this;
        (function (n) {
            _this.id = n;
        })(s.length);
    }
    return Class1;
})();
var t = new Class1("HELLO");
console.log("Class1 ID: " + t.id);

アップデート

ID だけでコンストラクターを呼び出せるようにする必要がある場合は、Steve が提案したように、ファクトリ メソッドを使用する必要があると思います。また、TS コンストラクターを非公開にできるとは思わないため、そのメソッドを非公開にする必要がある場合は、コンストラクターを完全に省いて、ファクトリ メソッドのペアを使用する必要があります。最初のインスタンスは次のようになります。

class Class1 {

    constructor(public id:number) {} // Public, unfortunately.

    static Fabricate(s:string):Class1 {
        return new Class1(s.length);
    }
}

var classA:Class1 = new Class1(1);
var classB:Class1 = Class1.Fabricate("Hello");

console.log(classA.id);   // "1"
console.log(classB.id);   // "5"

そして2番目は次のようなものです:

class Class1 {

    id:number;

    private static fabricate(n:number):Class1 {
        var class1:Class1 = new Class1();
        class1.id = n;
        return class1;
    }

    static Fabricate(s:string):Class1 {
        return fabricate(s.length);
    }
}

var classA:Class1 = Class1.Fabricate("Hello");

console.log(classA.id);   // "5"
于 2012-12-10T13:34:26.110 に答える
2

私の最初の考えはオーバーロードを使用することでしたが、これは数値コンストラクターの保護を処理しません。また、渡されたパラメーターを解決するためにコンストラクターに条件を追加することも意味します。

class MyClass {
    constructor(s: number);
    constructor(s: string);
    constructor(s: any) {

    }
}

したがって、実用的な解決策は、プライベート関数を持つことです。

class MyClass {
    constructor(s: string) {
        this.initialize(s.length);
    }

    private initialize(id: number) {

    }
}
于 2012-12-10T09:25:40.603 に答える
0

TypeScript 1.4 では、ユニオン型を使用して関数型のオーバーロードを許可できるようになりました。TypeScript ブログ投稿の説明を参照してください。これにより、1 つのコンストラクター関数で複数のコンストラクター入力タイプを使用できるようになります。

ユニオンの種類

JavaScript 関数は、いくつかの可能な引数タイプを取ることができます。これまでは、関数のオーバーロードを使用してこれをサポートしてきました。TypeScript 1.4 から、この機能を一般化し、ユニオン型を使用して値がさまざまな型の 1 つであることを指定できるようになりました。

function f(x: number | number[]) {
  if (typeof x === "number") {
    return x + 10;
  }
  else {
    // return sum of numbers
  }
}

ユニオン型の値を取得したら、typeof および instanceof チェックを使用して、型安全な方法で値を使用できます。上記の例でこれを使用しており、if ブロック内で x を数値型として扱うことができることに気付くでしょう。

Union 型は新しい種類の型であり、型を指定する場所であればどこでも機能します。

于 2015-04-13T13:16:39.373 に答える