为什么不能在派生类中创建构造函数?

时间:2018-09-10 10:18:06

标签: javascript angular typescript

class test1
{
    testName: string;
    testNum: number;
}

class test2 extends test1
{

    constructor(conName:string, conNum: number)
    {

    }
}

但是它不起作用,因为它说“派生类必须实现超级”

3 个答案:

答案 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