从 Typescript 中的基类创建子类的新实例 [重复]

Posted

技术标签:

【中文标题】从 Typescript 中的基类创建子类的新实例 [重复]【英文标题】:Create new instance of Child class from Base class in Typescript [duplicate] 【发布时间】:2016-03-31 23:41:26 【问题描述】:

我想从 Base 类方法创建 Child 类的新实例。

这有点复杂,但我会尽力解释。

这是一个例子:

class Base()
    constructor()

    clone()
        //Here i want to create new instance
    


class Child extends Base()


var bar = new Child();
var cloned = bar.clone();

clone instanceof Child //should be true!

所以。在这个例子中,我想克隆我的bar 实例,它应该是Child 的实例

嗯。我正在尝试使用Bar.clone 方法:

clone()
    return new this.constructor()

...这适用于编译代码,但我有打字稿错误:

error TS2351: Cannot use 'new' with an expression whose type lacks a call or construct signature.

有什么办法可以解决这个问题吗?

谢谢。希望这对一些人有所帮助1 :)

【问题讨论】:

如果有人仍然遇到这种情况并寻找不丢弃类型信息的解决方案,这里发布的关于返回 this 的策略 (***.com/a/45871004/131782) 似乎有效。 【参考方案1】:

克隆未知对象时,您需要强制转换为通用对象。 最好的方法是使用<any> 语句。

class Base 
    constructor() 

    

    public clone() 
        return new (<any>this.constructor);
    


class Child extends Base 

    test:string;

    constructor() 
        this.test = 'test string';
        super();
    



var bar = new Child();
var cloned = bar.clone();

console.log(cloned instanceof Child); // returns 'true'
console.log(cloned.test); // returns 'test string'

【讨论】:

不能说this.constructor派生自Base吗? 这样做会丢失类型信息。正确的解决方案可能涉及泛型,尽管我还没有完全弄清楚。

以上是关于从 Typescript 中的基类创建子类的新实例 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 Vue 从 TypeScript 中的基类更新属性

从 Java 中的基类访问子类字段

从子类中的基类添加构造函数

确定子类是不是具有在 Python 中实现的基类方法

typescript 创建一个将在组件上设置主题类的基类。

创建一个基类方法,根据调用该方法的子类实例化一个新的子类对象