JavaScript 类抽象属性实例化之后还是 undefined 的问题

这个问题比较抽象,实际上我也没有完全弄明白。

有这样一个父类:

export default abstract class Node<Config extends NodeConfig = NodeConfig> {
  // ……

  abstract node!: Konva.Node

  constructor(config?: Partial<Config>) {
    // 初始化
    this.init(config)
  }

  // 子类实现
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
  init(_config?: any) {
    /** */
  }
}

然后有这样一个子类:

export default class Shape<
  Config extends ShapeConfig = ShapeConfig
> extends Node<Config> {
  declare node: Konva.Shape

  init(config: ShapeConfig) {
    console.log('shape config: ', config)
    this.node = new ReKonva.Shape()
  }
}

再有一个子类:

export default class Rect extends Shape<RectConfig> {
  declare node: Konva.Rect
  init() {
    this.node = new ReKonva.Rect({})
  }
}

问题来了,new Rect() 返回的实例的 node 属性是 undefined,但在 int 里直接打印 this.node 是存在的,但打印 this 就是不存在 node。

对于底层原理我还不是很了解,但在将 Node 的 abstract node 改成非抽象属性(去掉 abstract)之后问题就解决了。

总之,抽象类/属性还是不要随便用了。