作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试创建一个辅助函数,添加柯里化(Currying),为类生成通用设置。例如:
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);
}
}
如何即时创建和返回新的构造函数或类?
最佳答案
试试这个 newPersonSex 的定义:
var newPersonSex = function (sex: string) {
return <new (name: string) => Person> <any> function (name: string) {
return new Person(name, sex);
}
}
您的代码的问题是函数只有调用签名,没有构造签名。我上面的示例解决了这个问题,首先断言该函数的类型是 any,然后断言 any 类型实际上是一个构造函数。
请注意,newPersonSex 的类型将从其返回类型推断出来,因此无需添加函数注释。
关于constructor - 如何在 TypeScript 中匿名类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12865626/
我是一名优秀的程序员,十分优秀!