У меня есть абстрактный класс A, B и C, оба наследуют A
Теперь я хочу расширить B и C теми же методами, поэтому в основном я хотел бы B и C наследовать класс ExtendedA, но я не хочу менять A, B и C
Однако он может работать с миксинами, так как A абстрактный, функция миксина не может знать, что абстрактный методы на самом деле реализованы в B и C, поэтому, естественно, выдает ошибку:
abstract class A {
protected a = 1;
public abstract hello(): void;
}
class B extends A {
public hello() {
console.log('hello from B');
}
}
class C extends A {
public hello() {
console.log('hello from C');
}
}
type AConstructor = new(...args: any[]) => A;
function ExtendedA<T extends AConstructor>(Base: T) {
return class extends Base {
public doSomething() {
this.hello();
console.log('do something', this.a);
}
}
}
class ExtendedB extends ExtendedA(B) {
}
class ExtendedC extends ExtendedA(C) {
}
const d = new D();
const e = new E();
d.doSomething();
// hello from B
// do something 1
e.doSomething();
// hello from C
// do something 1
test.ts:22:12 - error TS2653: Non-abstract class expression does not implement inherited abstract member 'hello' from class 'A'.
я что-то не вижу или нет способа это сделать в машинописи?