class test1
{
testName: string;
testNum: number;
}
class test2 extends test1
{
constructor(conName:string, conNum: number)
{
}
}
但是它不起作用,因为它说“派生类必须实现超级”
答案 0 :(得分:9)
您得到的错误实际上是:
派生类的构造函数必须包含“超级”调用
这样做的原因是必须通过调用基类构造函数(使用str(...)
关键字)来从派生类初始化基类。
super
答案 1 :(得分:2)
您需要显式调用父类的构造函数
class test1
{
testName: string;
testNum: number;
}
class test2 extends test1
{
constructor(conName:string, conNum: number)
{
super()
}
}
创建类时,将自动为您创建一个空的构造函数。这些是等效的:
// implicit
class test1
{
testName: string;
testNum: number;
}
// explicit
class test1
{
testName: string;
testNum: number;
public constructor() {
}
}
所有子代必须使用super
显式调用其父级构造函数。
每个包含构造函数的派生类都必须调用
super()
,该函数将执行基类的构造函数。 [•••]这是TypeScript将强制执行的重要规则。
从doc
我的猜测是,此决定可能是类型检查性能的折衷(需要来源)。通过执行此规则,打字稿不必检查基类的构造函数是否确实为空。
答案 2 :(得分:0)
由于您在extends
的子级test2
上使用了test1
(更多here),因此您需要调用super()
并传递任何内容属于test1
构造函数。但是,由于没有什么可传递的,因此只需在super()
构造函数中调用test2
。