具有自定义类型的TypeScript clone自我实例

问题描述 投票:3回答: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);
    }
}

但这不起作用。

还有其他建议吗?

typescript polymorphism clone
1个回答
4
投票

在运行时,this只是类的一个实例,而不是类构造函数,所以你不能调用new this()。但是你可以访问constructorthis属性并致电new this.constructor()

有一点皱纹;因为默认情况下不会编译,所以TypeScript认为constructor对象属性为Function。哪个不是newable。这有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
}

希望这对你有用。祝好运!

© www.soinside.com 2019 - 2024. All rights reserved.