2012-10-08 19 views
14

Im型のコンストラクタへの参照を取得して、その関数を値として渡す方法が不思議です。 基本的には、ジェネリック型レジストリインスタンスのメンバ関数を呼び出してインスタンスを作成できるようにするジェネリック型レジストリが必要です。例えばコンストラクタ関数の参照

:その後

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

クラスのコンストラクタ関数を参照することが可能であるならば誰でも知っていますか?

答えて

18

コンストラクタタイプリテラルまたはコンストラクタのタイプを記述するコンストラクタシグネチャ付きのオブジェクトタイプリテラルを使用できます(一般に、言語仕様のセクション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の実装で新しいコールを。

+0

ありがとう、私は仕様で '新しい'リテラルを見逃しました。 –

+1

in '// < - fails'解決策としては、もう失敗しないでしょう。もしそれが正しいとすれば、それを' // < - もはや失敗しません 'とか、それと似たように編集できますか?それ以外の場合、少し誤解している、thx – peter

6

typeof YourClassは、タイプ注釈で使用できるタイプのコンストラクタを提供します。

YourClassおよびthis.constructorはコンストラクタ自体です。だから、このコードはコンパイルされます。そのような状況で、あなたはそれを何any

new (<any> this.constructor)()を鋳造していないいくつかの不正行為を使用する必要があるので、

class A {} 

const B : typeof A = A; 

this.constructorは、(面白いです)活字体でコンストラクタ型の値として認識されていません

これだけです。

+0

この解決策の問題は、OPが "インタフェースを実装する型のコンストラクタ"型を参照したいという問題であり、 'IGeometry'がインタフェースの場合は' typeof IGeometry'とは言えません。渡されたparamが与えられたクラスまたはスーパークラスのコンストラクタである場合、これは素晴らしい方法です。 – jkjustjoshing

+1

'interface MyCtor {new():MyInterface}'はその時に仕事をしなければなりません。 – gaperton

+2

しかし、私は可能な限り 'typeof Class'を好んでいます。それはより具体的であり、継承チェーンを適切に処理します。 – gaperton

関連する問題