Jak anonimowych klas w maszynopisie

głosy
7

Próbuję utworzyć funkcję pomocnika, aby dodać currying, aby wygenerować wspólnych ustawień dla klas. Na przykład:

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'); 

Tak, że teraz, kiedy MalePerson i FemalePerson obiekty są tworzone, to faktycznie tylko zwraca nową instancję Osoba zamiast.

var m = new MalePerson( 'john' );

W celu dla systemu typu pozwala mi nadal używać „new”, MalePerson musi być typu konstruktor. Na przykład: 'nowy (nazwa: String) => Person'. Który również musi być zwracany typ funkcji.

Jednak przy tych zgłoszeń dodane, nie może powrócić do funkcji „newPersonSex od wewnątrz”. Na przykład jest nieprawidłowy:

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

Jak mogę utworzyć i powrócić nową funkcję konstruktora lub klasy w locie?

Utwórz 12/10/2012 o 20:14
źródło użytkownik
W innych językach...                            


1 odpowiedzi

głosy
2

Spróbować tej definicji newPersonSex:

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

Problemem jest to, że kod działa tylko mieć podpisy połączeń, nie budować podpisy. Mój przykład powyżej działa wokół to najpierw twierdząc, że typ tej funkcji jest dowolny, a następnie twierdząc, że każdy rodzaj jest rzeczywiście konstruktor.

Należy pamiętać, że rodzaj newPersonSex będzie wywnioskować z jego typ zwracany więc nie ma potrzeby, aby dodać adnotację funkcji.

Odpowiedział 12/10/2012 o 21:17
źródło użytkownik

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