Referenziare la funzione di costruzione

voti
14

Im chiedendo come posso ottenere un riferimento a un costruttore di tipi di passare alla funzione come un valore. In sostanza, mi piacerebbe avere un registro tipo generico che permetterebbe casi da creare chiamando una funzione di membro di un'istanza del tipo di registro generico.

Per esempio:

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

Dopo:

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

Qualcuno sa se è possibile fare riferimento a una funzione di classi di costruzione?

È pubblicato 08/10/2012 alle 19:17
fonte dall'utente
In altre lingue...                            


2 risposte

voti
18

È possibile utilizzare il tipo di costruzione letterale o un tipo di oggetto letterale con una firma costrutto per descrivere il tipo di un costruttore (vedi, in generale, sezione 3.5 della specifica lingua). Per utilizzare il vostro esempio, il seguente dovrebbe funzionare:

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

Si noti il ​​tipo di costruzione letterale nella lista parametro del costruttore di GenometryTypeInfo, e la nuova chiamata nella realizzazione di createInstance.

Risposto il 08/10/2012 a 19:27
fonte dall'utente

voti
6

typeof YourClassti dà costruttore tipo che può essere utilizzato in annotazioni di tipo.

YourClassed this.constructorè CONSTRUCTOR stessa. Quindi, questo codice compila:

class A {}

const B : typeof A = A;

this.constructor non è riconosciuto come valore di tipo costruttore dal dattiloscritto (che è divertente), quindi in situazioni del genere è necessario utilizzare un po 'di barare il cast non any

new (<any> this.constructor)()

Questo è tutto.

Risposto il 30/06/2016 a 19:40
fonte dall'utente

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