Hacer referencia a la función constructora

votos
14

Im pregunto cómo puedo obtener una referencia a un constructor de tipos de pasar a la función como un valor. Básicamente, me gustaría tener un registro de tipo genérico que permita a las instancias que se creen llamando a una función miembro de una instancia genérica tipo de registro.

Por ejemplo:

class GeometryTypeInfo
{        
    constructor (public typeId: number, public typeName: string, public fnCtor: (...args: any[]) => IGeometry) {
    }
    createInstance(...args: any[]) : IGeometry { return this.fnCtor(args); }
    }
}

Luego:

class Point implements IGeometry {
    constructor(public x: number, public y: number) { }

    public static type_info = new GeometryTypeInfo(1, 'POINT', Point); // <- fails
    // also fails: 
    //    new GeometryTypeInfo(1, 'POINT', new Point);
    //    new GeometryTypeInfo(1, 'POINT', Point.prototype);
    //    new GeometryTypeInfo(1, 'POINT', Point.bind(this));
}

Alguien sabe si es posible hacer referencia a una función de constructor de clases?

Publicado el 08/10/2012 a las 19:17
fuente por usuario
En otros idiomas...                            


2 respuestas

votos
18

Puede utilizar el constructor de tipo literal o un tipo de objeto literal con una firma constructo para describir el tipo de un constructor (véase, en general, la sección 3.5 de la especificación del lenguaje). Para utilizar el ejemplo, lo siguiente debería funcionar:

interface IGeometry {
    x: number;
    y: number;
}

class GeometryTypeInfo
{        
    constructor (public typeId: number, public typeName: string, public fnCtor: new (...args: any[]) => IGeometry) {
    }
    createInstance(...args: any[]) : IGeometry { return new this.fnCtor(args); }
}

class Point implements IGeometry {
    constructor(public x: number, public y: number) { }

    public static type_info = new GeometryTypeInfo(1, 'POINT', Point);
}

Note el constructor de tipo literal en la lista de parámetros del constructor GenometryTypeInfo, y la nueva llamada en la implementación de createInstance.

Respondida el 08/10/2012 a las 19:27
fuente por usuario

votos
6

typeof YourClassle da constructor de tipo que puede ser utilizado en las anotaciones de tipos.

YourClassy this.constructores constructor de sí mismo. Por lo tanto, este código se compila:

class A {}

const B : typeof A = A;

this.constructor no se reconoce como valor de tipo constructor por mecanografiado (que es divertido), por lo que en situaciones como la que tiene que utilizar un poco de engaño fundición que hay any

new (<any> this.constructor)()

Eso es.

Respondida el 30/06/2016 a las 16:40
fuente por usuario

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