Добавить метод ко всем подклассам без изменения родительского класса - PullRequest
1 голос
/ 14 марта 2020

У меня есть абстрактный класс 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'.

я что-то не вижу или нет способа это сделать в машинописи?

1 Ответ

2 голосов
/ 17 марта 2020

Ваша проблема в том, что AConstructor определяет тип, который расширяет A, а ExtendedA расширяет этот тип, но ни один класс не реализует A (который является абстрактным) методы. Попробуйте вместо этого использовать интерфейс:


interface AInterface {
    hello();
}

type AConstructor = new (...args: any[]) => AInterface;

let ExtendedA = (Base: AConstructor): any => {
  return class extends Base {
    public doSomething() {
      this.hello();
      console.log("do something", this.a);
    }
  };
};

Примечание : защищенное свойство недоступно для внуков, только для детей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...