2012-10-12 8 views
7

私は、カリングを追加して、クラスの一般的な設定を生成するヘルパー関数を作成しようとしています。例:TypeScriptの匿名クラスへの方法

class Person { 
    private name: string; 
    private sex: string; 

    constructor (name: string, sex: string) { 
     this.name = name; 
     this.sex = sex; 
    } 
} 

var newPersonSex = function (sex: string) { 
    return function (name: string) { 
     return new Person(name, sex); 
    } 
} 

var MalePerson = newPersonSex('male'); 
var FemalePerson = newPersonSex('female'); 

MalePersonとFemalePersonオブジェクトが作成されると、実際には代わりにPersonの新しいインスタンスが返されます。

var m = new MalePerson('john'); 

「new」を使用できるようにするために、MalePersonはコンストラクタタイプである必要があります。たとえば、 'new(name:string)=> Person'などです。それは関数の戻り型である必要もあります。

これらの宣言が追加されても、私は 'newPersonSex'の内部から関数を返すことはできません。例えば、これは無効です:

var newPersonSex = function (sex: string) : new(name:string) => Person { 
    return function (name: string) { 
     return new Person(name, sex); 
    } 
} 

新しいコンストラクタ関数またはクラスを作成して返すにはどうしたらいいですか?

答えて

2

はnewPersonSexのこの定義を試してみてください:

var newPersonSex = function (sex: string) { 
    return <new (name: string) => Person> <any> function (name: string) { 
     return new Person(name, sex); 
    } 
} 

あなたのコードの問題は、機能だけで署名を構築し、コールの署名を持っていないということです。上記の私の例は、まず、その関数の型がanyであることを宣言し、その後、その型が実際にはコンストラクタであることを宣言することによって、この問題を回避します。

newPersonSexの型は戻り値の型から推測されるため、関数注釈を追加する必要はありません。

関連する問題