Как анонимные классы в 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);
}
}
как я могу создать и вернуть новую функцию конструктора или класс на лету?
1 ответов
попробуйте это определение newPersonSex:
var newPersonSex = function (sex: string) {
return <new (name: string) => Person> <any> function (name: string) {
return new Person(name, sex);
}
}
проблема с вашим кодом заключается в том, что функции просто имеют подписи вызовов, а не создают подписи. Мой пример выше работает вокруг этого, сначала утверждая, что тип этой функции является любым, а затем утверждая, что любой тип на самом деле является конструктором.
обратите внимание, что тип newPersonSex будет выведен из его возвращаемого типа, поэтому нет необходимости добавлять аннотацию функции.