Référençant la fonction constructeur

voix
14

Im se demandant comment je peux obtenir une référence à un constructeur de types pour passer la fonction en tant que valeur. Au fond, je voudrais avoir un registre de type générique qui permettrait instances à créer en appelant une fonction de membre d'une instance de registre de type générique.

Par exemple:

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

Plus tard:

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

Quelqu'un sait s'il est possible de faire référence à une fonction constructeur classes?

Créé 08/10/2012 à 19:17
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
18

Vous pouvez utiliser le type de constructeur littéral ou un type d'objet littéral avec une signature de construction pour décrire le type d'un constructeur (voir, en général, la section 3.5 de la spécification de la langue). Pour utiliser votre exemple, ce qui suit devrait fonctionner:

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

Notez le type de constructeur littéral dans la liste des paramètres constructeur de GenometryTypeInfo, et le nouvel appel à la mise en œuvre de createInstance.

Créé 08/10/2012 à 19:27
source utilisateur

voix
6

typeof YourClassvous donne constructeur de type qui peut être utilisé dans les annotations de type.

YourClasset this.constructorest lui - même constructeur. Ainsi, ce code compile:

class A {}

const B : typeof A = A;

this.constructor est pas reconnu comme valeur de type constructeur par tapuscrit (ce qui est drôle), donc dans ce genre de situations, vous devez utiliser une tricherie castant pas any

new (<any> this.constructor)()

C'est tout.

Créé 30/06/2016 à 19:40
source utilisateur

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