Făcând referire funcția de constructor

voturi
14

Im întrebam cum pot obține o referință la un constructor tipuri pentru a trece funcția ca valoare. Practic, aș dori să aibă un registru de tip generic, care ar permite instanțelor să fie creată prin apelarea unei funcții membru al unui registru generic de instanță de tip.

De exemplu:

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

Mai tarziu:

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

Oricine știe dacă este posibil să se referire la o funcție de clase constructor?

Întrebat 08/10/2012 la 19:17
sursa de către utilizator
În alte limbi...                            


2 răspunsuri

voturi
18

Puteți utiliza tipul de constructor literal sau un tip de obiect literal cu o semnătură construct pentru a descrie tipul de constructor (a se vedea, în general, secțiunea 3.5 din spec limbii). Pentru a utiliza exemplul dvs., următoarele ar trebui să funcționeze:

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

Observați tipul de constructor literal în lista de parametrul de construcție GenometryTypeInfo, iar noul apel în punerea în aplicare a createInstance.

Publicat 08/10/2012 la 19:27
sursa de către utilizator

voturi
6

typeof YourClassvă oferă constructor de tip care poate fi utilizat în adnotări de tip.

YourClassși this.constructoreste ea însăși constructor. Deci, acest cod compilează:

class A {}

const B : typeof A = A;

this.constructor nu este recunoscută ca valoare de tip constructor de mașină de scris (care este amuzant), astfel încât în ​​situații care aveți nevoie pentru a utiliza unele înșelăciune turnare ea nu any

new (<any> this.constructor)()

Asta e.

Publicat 30/06/2016 la 19:40
sursa de către utilizator

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