2012-10-12 20 views
7

Sto cercando di creare una funzione di supporto, aggiungere curring, generare impostazioni comuni per le classi. Per esempio:Come classi anonime in 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'); 

Così ora quando si creano MalePerson e FemalePerson oggetti, è in realtà solo restituisce una nuova istanza della persona invece.

var m = new MalePerson('john'); 

Affinché il sistema di tipo mi permette di utilizzare ancora 'nuovo', MalePerson ha bisogno di essere un tipo di costruzione. Ad esempio: 'new (name: string) => Person'. Anche questo deve essere il tipo di ritorno della funzione.

Tuttavia, con queste dichiarazioni aggiunte, non è possibile restituire una funzione dall'interno di "newPersonSex". Per esempio, questo non è valido:

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

Come posso creare e restituire una nuova funzione di costruzione o di classe al volo?

risposta

2

Prova questa definizione di newPersonSex:

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

Il problema con il vostro codice è che le funzioni hanno solo le firme di chiamata, non costruiscono le firme. Il mio esempio sopra funziona a questo proposito affermando prima che il tipo di quella funzione è any, e quindi asserendo che qualsiasi tipo è in realtà un costruttore.

Si noti che il tipo di newPersonSex verrà dedotto dal tipo restituito, quindi non è necessario aggiungere un'annotazione di funzione.

Problemi correlati