typescript - Referera till konstruktörsfunktionen


Jag undrar hur jag kan få en referens till en typs konstruktor för att skicka funktionen som ett värde. I grund och botten skulle jag vilja ha ett generiskt typregister som skulle tillåta att instanser skapas genom att anropa en medlemsfunktion av en instans av det generiska typregistret.

Till exempel:

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

Senare :

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

Någon som vet om det är möjligt att referera till en klass konstruktorfunktion?

Svar #1

Du kan använda konstruktörstypliteral eller ett objektstypliteral med en konstrukt-signatur för att beskriva typen av en konstruktör (se i allmänhet avsnitt 3.5 i språkets specifikation). För att använda ditt exempel bör följande fungera:

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

Notera konstruktörstyp-literalet i GeometryTypeInfo:s konstruktörsparameterlista, och det nya anropet i implementationen av createInstance.

Svar #2

typeof YourClass ger dig konstruktörens typ som kan användas i typnoteringar.

YourClass och this.constructor är konstruktorn själv. Så, denna kod kompileras:

class A {}

const B : typeof A = A;

this.constructor känns inte igen som ett värde av konstruktörstyp av TypeScript (vilket är roligt), så i situationer som den behöver du använda någon fuskaktig typomvandling till any

new (<any> this.constructor)()

Det är det.

Relaterade artiklar