我想克隆当前的类实例并在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);
}
}
但这不起作用。
还有其他建议吗?
在运行时,this
只是类的一个实例,而不是类构造函数,所以你不能调用new this()
。但是你可以访问constructor
的this
属性并致电new this.constructor()
。
有一点皱纹;因为默认情况下不会编译,所以TypeScript认为constructor
对象属性为Function
。哪个不是new
able。这有reasons。
要在没有警告的情况下编译new this.constructor()
,您需要断言类似new (this.constructor as any)()
的类型,或者使用正确的签名将constructor
属性添加到State
:
class State
{
"constructor": new() => this; // no-arg polymorphic constructor
public clone():this
{
const state = new this.constructor(); // okay
this._copyData(state);
return state;
}
// etc
}
希望这对你有用。祝好运!