派生类的构造函数必须包含超级调用
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 扩展的自定义类的文章。
额外资源
您可以通过查看以下教程来了解有关相关主题的更多信息: