javascript - 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 上有自己的特殊变体。因此,返回的类型应该是最初提供给构造函数的类型。Core
this.players
SpecificPlayer
(或者有没有更好的方法来组织/格式化我的代码?)
解决方案
推荐阅读
- javascript - 如何在反应中将函数传递给另一个组件
- c# - 不能隐式转换 int 类型?从 LINQ 表达式中检索和 int 字段值时为 int
- python - 用 python 比较两个 Excel 文件:第一个 - 找不同;2 突出显示
- python - 根据标签获取快照成本
- java - 在java中实现接口时面临的问题
- css - 样式在css中没有绑定
- excel - VBA将excel中的不同字段传输到一个没有表格的word文档中
- r - 如何将 R Markdown 输出与以前的版本进行比较?
- apache - “httpd.service 的作业失败,因为控制进程以错误代码退出。” 我该如何解决?
- elasticsearch - Elasticsearch 6 中一个索引的多个映射