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 回答