Referenzierung der Konstruktorfunktion

stimmen
14

Ich frage mich, wie ich einen Verweis auf einen Typen Konstruktor bekommen kann die Funktion als Wert zu übergeben. Grundsätzlich wäre Ich mag eine generische Typ-Registrierung haben, die Instanzen erlauben würde, durch den Aufruf eine Member-Funktion einer generischen Typ Registry Instanz erstellt werden.

Beispielsweise:

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

Später:

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

Wer weiß, ob es möglich ist, eine Klasse-Konstruktor Funktion zu verweisen?

Veröffentlicht am 08/10/2012 um 19:17
quelle vom benutzer
In anderen Sprachen...                            


2 antworten

stimmen
18

Sie können den Konstruktor Typen Literal oder einen Objekttyp Literal mit einem Konstrukt Signatur verwenden, um die Art eines Konstruktors (siehe allgemein Abschnitt 3.5 der Sprache SPEC) zu beschreiben. So verwenden Sie Ihr Beispiel sollte die folgende Arbeiten:

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

Beachten Sie die Konstruktortyp wörtlichen in GenometryTypeInfo Konstruktor Parameterliste und den neuen Anruf bei der Umsetzung von createInstance.

Beantwortet am 08/10/2012 um 19:27
quelle vom benutzer

stimmen
6

typeof YourClassgibt Ihnen Konstruktor Art , die in Typenannotationen verwendet werden können.

YourClassund this.constructorist selbst Konstruktor. So stellt dieser Code:

class A {}

const B : typeof A = A;

this.constructor wird nicht als Wert Konstruktortyp von Typoskript erkannt (was lustig ist), so dass in solchen Situationen, dass Sie es Gießen einige Betrug verwenden müssen keine any

new (<any> this.constructor)()

Das ist es.

Beantwortet am 30/06/2016 um 19:40
quelle vom benutzer

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