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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了具有自定义类型的TypeScript clone自我实例相关的知识,希望对你有一定的参考价值。

我想克隆当前的类实例并在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()。但是你可以访问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
}

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

以上是关于具有自定义类型的TypeScript clone自我实例的主要内容,如果未能解决你的问题,请参考以下文章

TypeScript:带有自定义方法的工厂 - 第三步

Typescript:用'this'获取自定义界面的类型?

如何在 TypeScript 中创建自定义类型

TypeScript 如何知道自定义数组类型中长度字段的行为?

如何在 TypeScript 中迭代自定义文字类型?

TypeScript:如何为已安装的 npm 包定义自定义类型?