7

ヘルパー関数を作成し、カリー化を追加し、クラスの一般的な設定を生成しようとしています。例えば:

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);
    }
}

新しいコンストラクター関数またはクラスをその場で作成して返すにはどうすればよいですか?

4

1 に答える 1

2

newPersonSexの次の定義を試してください。

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

コードの問題は、関数が署名を作成するのではなく、呼び出し署名を持っているだけであるということです。上記の私の例では、最初にその関数の型がanyであると主張し、次にany型が実際にはコンストラクターであると主張することでこれを回避しています。

newPersonSexのタイプは、その戻りタイプから推測されるため、関数アノテーションを追加する必要がないことに注意してください。

于 2012-10-12T20:17:27.857 に答える