在抽象类构造函数内部调用的抽象方法看不到派生类的属性

时间:2018-12-15 16:59:04

标签: typescript

以下代码应打印“ Hello World!”。屏幕上。 Insead会打印Error: Cannot read property 'id' of undefined。为什么?

abstract class Parent {
  constructor() {
    console.log(this.getData());
  }

  abstract getData(): string;
}

class Child extends Parent {
  constructor(private item: any) {
    super();
  }

  getData(): string {
    return this.item.id;
  }
}

new Child({id: 'Hello World!'});

Here是一个有效的示例。

1 个答案:

答案 0 :(得分:4)

问题在于,在将参数getData分配给私有字段{{1}之前之前,在Parent构造函数中对item的调用发生了}。那是因为自动初始化发生在item调用之后,而不是在super()调用之后。查看***条评论:

abstract class Parent {
  constructor() {
    console.log(this.getData());  // *** Calls Child's getData
  }

  abstract getData(): string;
}

class Child extends Parent {
  constructor(private item: any) {
    super();                       // *** Calls Parent's constructor
    // ** Automatic initialization happens here, *after* the `super()` call
  }

  getData(): string {
    return this.item.id;           // *** So here, `this.item` is `undefined`
  }
}

new Child({id: 'Hello World!'});

这是从构造函数中调用方法通常不是最佳实践的原因之一:它们可以被子类覆盖,但是子类的初始化可能不完整(如您的情况)。