Как анонимные классы в машинописном

голоса
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' );

Для того, чтобы система типа позволяют мне по-прежнему использовать «новый», MalePerson должен быть конструктором типа. Например: новый (название: строка) => Person. Это также должно быть тип возвращаемого значения функции.

Однако с добавлением этих заявлений, я не могу вернуть функцию из внутри 'newPersonSex. Например, это является недопустимым:

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

Как я могу создать и вернуть новую функцию конструктора или класса на лету?

Задан 12/10/2012 в 20:14
источник пользователем
На других языках...                            


1 ответов

голоса
2

Попробуйте это определение newPersonSex:

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

Проблема с кодом является то, что функции просто подписи вызовов, не построить подписи. Мой пример выше работает вокруг этого первого утверждения, что тип этой функции любой, а затем утверждать, что любой тип на самом деле конструктор.

Обратите внимание, что тип newPersonSex будет выведен из возвращаемого типа поэтому нет необходимости добавлять функцию аннотацию.

Ответил 12/10/2012 в 21:17
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more