2017-12-17 17 views
1

とクローンの自己インスタンスを、私は現在のクラスのインスタンスのクローンを作成し、clone()内の多型クラスのインスタンスを作成したい、このような何か:活字体の自己クラスタイプ

class State 
{ 
    public clone():State 
    { 
     const state = new State(); 
     this._copyData(state); 
     return state; 
    } 

    protected _copyData(target:this):void 
    { 
    } 
} 

class StateExtends extends State 
{ 
    public clone():StateExtends 
    { 
     const state = new StateExtends(); 
     return state; 
    } 

    protected _copyData(target:this):void 
    { 
     super._copyData(target); 
    } 
} 

Stateクラスをオーバーライドするとき、私はclone()をしたいです署名はすべてのクラス階層で同じままにしておきます。

class State 
{ 
    public clone():this 
    { 
     const state = new this(); 
     this._copyData(state); 
     return state; 
    } 

    protected _copyData(target:this):void 
    { 
    } 
} 

class StateExtends extends State 
{ 
    protected _copyData(target:this):void 
    { 
     super._copyData(target); 
    } 
} 

しかし、これは機能しません。

他の提案はありますか?

答えて

2

実行時にthisはクラスのインスタンスであり、クラスコンストラクタではないため、new this()を呼び出すことはできません。しかし、constructorプロパティのthisにアクセスし、new this.constructor()と電話することができます。

少しシワがあります。既定では、TypeScriptはconstructorオブジェクトプロパティをFunctionと見なしているため、コンパイルされません。どちらもnewできません。これにはreasonsがあります。 new this.constructor()が警告なしでコンパイルするために取得するには

、あなたはnew (this.constructor as any)()のようなタイプを主張、または右署名でStateconstructorプロパティを追加する必要があり、次のいずれか

class State 
{ 
    "constructor": new() => this; // no-arg polymorphic constructor 

    public clone():this 
    { 
     const state = new this.constructor(); // okay 
     this._copyData(state); 
     return state; 
    } 

    // etc 
} 

うまくいけば、あなたのために働く必要があること。がんばろう!

+0

ありがとうございました。 '' constructor '':new()=> this; 'は必要ありません。それなしでコンパイルする。 TypeScript v2.6.2 –