Как анонимные классы в 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 будет выведен из его возвращаемого типа, поэтому нет необходимости добавлять аннотацию функции.