从基类返回子类的新实例:循环引用

时间:2018-07-14 20:27:56

标签: typescript

我想像这样在基类的静态方法中创建一个孩子的实例:

class Baseclass {
    public static create(){
        const newInstance = new Childclass();
        return newInstance;
    }
}

class Childclass extends Baseclass {}

const anInstance = Baseclass.create();

这按预期工作。但是,如果我想将每个类放在一个单独的文件中,我会得到

  

TypeError:类扩展未定义的值不是构造函数或null

您可以看到示例here。 我认为这与创建某种循环引用的导入有关。但是,由于这两个类都在同一个文件中定义时可以工作,因此我仅假定它们在单独的文件中时也应以某种方式工作。

2 个答案:

答案 0 :(得分:2)

正如我在github issue和相关github repository about the problem上所发现的那样,解决方案是将index.ts

一起使用
export { Baseclass } from './baseclass';
// NOTE: Putting this line first causes a problem.
export { Childclass } from './childclass';

然后仅引用它而不是文件。参见this example

答案 1 :(得分:1)

BaseclassChildclass放入不同的模块会在它们之间创建循环引用,而这些循环引用是ES模块无法解决的; Baseclass需要导入Childclass才能进行定义,反之亦然。

这里的问题是Baseclass。它不是真正的基类,因为它直接引用子类,而它不应该知道其后代。如果应该使用工厂方法,则可以在静态方法中将this引用为类构造函数。如果不应单独使用基类,则它可以是抽象的:

abstract class Baseclass {
    public static create(){
        return new this();
    }
}

class Childclass extends Baseclass {}