首页 > 解决方案 > Javascript - “复合”类继承

问题描述

不要与从多个类继承混淆。

假设有一个类 Player,它有自己的方法和属性:

class Player {
//...
}

接下来,假设有一个从 Player 扩展而来的类,具有自己的特殊属性

class SpecificPlayer extends Player {
  constructor() {
    super();
    this.foo = "bar";
  }
}

现在假设有另一个类,Core,具有类型属性Player[](类型通过 VSCode 中的 JSDoc 样式注释定义),以及返回该数组的一部分的方法。

class Core {
  constructor(players) {
    /** @type {Player[]} */
    this.players = players;
  }

  getSomePlayers() {
    return this.players.filter(...);
  }
}

最后,让有一个从 Core 扩展的类,其构造函数和方法如下:

class SpecificClass extends Core {
  /** @param {SpecifcPlayer[]} players */
  constructor(players) {
    super(players);
  }

  doThing() {
    console.log(this.players[0].foo);
    this.getSomePlayers().forEach(p => console.log(p.foo));
  }
}

现在,如果运行以下主体代码:

const SpecificInstance = new SpecificClass([new SpecificPlayer(), new SpecificPlayer()]);
SpecificInstance.doThing();

一切都很好,花花公子——所有日志语句都成功打印了“bar”。

但是,在编写代码时(特别是 的主体doThing),VSCode Intellisense 只会识别this.players为 的类型Player,这意味着它不会识别属性foo。我将如何编写类以使 VSCode 自动完成/智能感知识别正确的类型,并且使用的this.players每个方法也返回正确的类型?实际上,有几个从 Core 扩展而来的类,其中一些在 Player 上有自己的特殊变体。因此,返回的类型应该是最初提供给构造函数的类型。Corethis.playersSpecificPlayer

(或者有没有更好的方法来组织/格式化我的代码?)

标签: javascriptinheritancevisual-studio-codetypesintellisense

解决方案


推荐阅读