2012-10-12 229 views
7

Estoy tratando de crear una función de ayuda, para agregar currying, para generar configuraciones comunes para las clases. Por ejemplo:Cómo clases anónimas en 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'); 

Así que ahora, cuando se crean objetos MalePerson y FemalePerson, que en realidad sólo devuelve una nueva instancia de la persona en su lugar.

var m = new MalePerson('john'); 

Para que el sistema de tipos me permite seguir utilizando 'nuevo', MalePerson tiene que ser un constructor de tipos. Por ejemplo: 'new (name: string) => Person'. Eso también necesita ser el tipo de devolución de la función.

Sin embargo, con esas declaraciones agregadas, no puedo devolver una función desde adentro 'newPersonSex'. Por ejemplo, esto no es válido:

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

¿Cómo puedo crear y devolver una nueva función o clase de constructor sobre la marcha?

Respuesta

2

Pruebe esta definición de newPersonSex:

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

El problema con el código de funciones es que sólo tienen firmas de llamadas, no construyen firmas. Mi ejemplo anterior funciona alrededor de esto afirmando primero que el tipo de esa función es cualquiera, y luego afirmando que cualquier tipo es en realidad un constructor.

Tenga en cuenta que el tipo de newPersonSex se deducirá de su tipo de devolución, por lo que no es necesario agregar una anotación de función.

Cuestiones relacionadas