派生类的构造函数必须包含超级调用

派生类的构造函数必须包含超级调用

Constructors for derived classes must contain a super call

当扩展父类而没有调用子类的构造函数super()中的方法时,会出现“派生类的构造函数必须包含超级调用”的错误。

要解决该错误,请super()在子类的构造函数中调用该方法。

下面是错误如何发生的示例。

索引.ts
class Parent { name = 'Parent'; constructor(public a: number, public b: number) { this.a = a; this.b = b; } } class Child extends Parent { name = 'Child'; // ⛔️ Error: Constructors for derived classes must contain a 'super' call.ts(2377) constructor(public a: number) { this.a = a; } }

如果不先调用方法,我们就无法访问this子类构造函数中的关键字super()

super()在子类的构造函数中调用方法

要解决该错误,请

在子类的构造函数中调用
super() 。

索引.ts
class Parent { name = 'Parent'; constructor(public a: number, public b: number) { this.a = a; this.b = b; } } class Child extends Parent { name = 'Child'; constructor(public a: number) { super(a, a); // 👈️ call super() here this.a = a; } }

应该在访问子构造函数中的关键字super()之前调用该方法。this

该方法调用父类的构造函数,因此传递给调用的参数取决于父类的构造函数采用的参数。 super()

在示例中,父类的构造函数接受 2 个类型的参数
number

调用super()会调用父类的constructor()方法

您必须提供父类采用的所有参数,因为当您调用该super()方法时,您实际上是在调用父类的构造函数。

一旦调用了该super()方法,就可以在子类的构造函数中使用关键字。 this

你可以想象关键字super是对父类的引用。

super当子类必须引用父类的方法时,您可能还会看到使用的关键字。

索引.ts
class Parent { name = 'Parent'; constructor(public a: number, public b: number) { this.a = a; this.b = b; } doMath(): number { return this.a + this.b; } } class Child extends Parent { name = 'Child'; constructor(public a: number) { super(a, a); this.a = a; } override doMath(): number { // 👇️ super.doMath() calls doMath method of parent return this.a * this.a + super.doMath(); } } const child1 = new Child(3); // 👇️ (3 * 3) + (3 + 3) = 15 console.log(child1.doMath()); // 👉️ 15
例子中的子类重写doMath方法,使用super关键字调用doMath父类的方法。

这些是关键字在类中最常见的两种用法super

  • 调用父级的构造函数,因此您可以使用this关键字
  • 重写时引用父类的方法

我还写了一篇关于
如何创建从 Error 扩展的自定义类的文章。

额外资源

您可以通过查看以下教程来了解有关相关主题的更多信息: