18

関数を値として渡すために型コンストラクターへの参照を取得するにはどうすればよいのでしょうか。基本的には、ジェネリック型レジストリインスタンスのメンバー関数を呼び出してインスタンスを作成できるジェネリック型レジストリが欲しいです。

例えば:

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

クラスコンストラクター関数を参照できるかどうか誰か知っていますか?

4

2 に答える 2

22

コンストラクター型リテラルまたはコンストラクター署名付きのオブジェクト型リテラルを使用して、コンストラクターの型を記述することができます(通常、言語仕様のセクション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);
}

のコンストラクタパラメータリストのコンストラクタタイプリテラルGeometryTypeInfoと、の実装での新しい呼び出しに注意してくださいcreateInstance

于 2012-10-08T18:27:13.507 に答える
9

typeof YourClassタイプアノテーションで使用できるコンストラクタータイプを提供します。

YourClassthis.constructorコンストラクターそのものです。したがって、このコードは次のようにコンパイルされます。

class A {}

const B : typeof A = A;

this.constructorTypeScriptではコンストラクター型の値として認識されないので(これは面白いです)、そのような状況では、不正行為を使用する必要があります。any

new (<any> this.constructor)()

それでおしまい。

于 2016-06-30T19:40:11.327 に答える