引用构造函数

时间:2012-10-08 18:17:42

标签: typescript

我想知道如何获取对类型构造函数的引用以将函数作为值传递。 基本上,我希望有一个泛型类型注册表,允许通过调用泛型类型注册表实例的成员函数来创建实例。

例如:

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

随后:

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

任何人都知道是否可以引用类构造函数?

2 个答案:

答案 0 :(得分:20)

您可以使用构造函数类型文字或带有构造签名的对象类型文字来描述构造函数的类型(通常参见语言规范的第3.5节)。要使用您的示例,以下内容应该有效:

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

注意GenometryTypeInfo的构造函数参数列表中的构造函数类型文字,以及createInstance实现中的新调用。

答案 1 :(得分:8)

typeof YourClass为您提供构造函数 type ,可以在类型注释中使用。

YourClassthis.constructor是构造函数本身。所以,这段代码编译:

class A {}

const B : typeof A = A;

this.constructor未被TypeScript识别为构造函数类型的值(这很有趣),因此在类似的情况下,您需要使用一些作弊行为,而不是any

new (<any> this.constructor)()

那就是它。