我想像这样在基类的静态方法中创建一个孩子的实例:
class Baseclass {
public static create(){
const newInstance = new Childclass();
return newInstance;
}
}
class Childclass extends Baseclass {}
const anInstance = Baseclass.create();
这按预期工作。但是,如果我想将每个类放在一个单独的文件中,我会得到
TypeError:类扩展未定义的值不是构造函数或null
您可以看到示例here。 我认为这与创建某种循环引用的导入有关。但是,由于这两个类都在同一个文件中定义时可以工作,因此我仅假定它们在单独的文件中时也应以某种方式工作。
答案 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)
将Baseclass
和Childclass
放入不同的模块会在它们之间创建循环引用,而这些循环引用是ES模块无法解决的; Baseclass
需要导入Childclass
才能进行定义,反之亦然。
这里的问题是Baseclass
。它不是真正的基类,因为它直接引用子类,而它不应该知道其后代。如果应该使用工厂方法,则可以在静态方法中将this
引用为类构造函数。如果不应单独使用基类,则它可以是抽象的:
abstract class Baseclass {
public static create(){
return new this();
}
}
class Childclass extends Baseclass {}