我正在寻找以下解决方案:
class BasicTable {
addData() {
console.log("******** BasicTable");
}
}
class BasicHtmlTable extends BasicTable {
override addData() {
console.log("--------- BasicHtmlTable");
}
}
class Table<T extends BasicTable | BasicHtmlTable> extends BasicTable {
printData() {
console.log("--------- Table");
super.addData();
}
}
class A extends Table<BasicTable> {
test() {
this.printData();
}
}
class B extends Table<BasicHtmlTable> {
test() {
this.printData();
}
}
const aInstance = new A();
const bInstance = new B();
aInstance.test();
bInstance.test();
对于 A 类,我想使用 BasicTable 中的方法。 对于 B 类,我想使用 BasicHtmlTable 中的方法。
但我的实现始终使用 BasicTable 中的方法而不是 BasicHtmlTable。
我需要建议在打字稿中实现这一点。
详细提到了
TypeScript 泛型用于在编译时进行类型检查,但不影响运行时行为。
Table
类被定义为扩展BasicTable
。泛型类型 T 确保 T 只能是 BasicTable 或 BasicHtmlTable (并在复杂化过程中进行验证),但它不会改变 Table
扩展 BasicTable
的事实。
如果您希望
B
扩展 BasicHtmlTable
,您可以使用组合而不是继承(请参阅下面的代码示例)。
constructor(private table: T) {
super();
}
printData() {
console.log("--------- Table");
this.table.addData();
}
}
class A extends Table<BasicTable> {
constructor() {
super(new BasicTable());
}
test() {
this.printData();
}
}
class B extends Table<BasicHtmlTable> {
constructor() {
super(new BasicHtmlTable());
}
test() {
this.printData();
}
}
(使用其他设计也可能得到类似的结果,但组合是一个众所周知的概念)