Заставить класс расширять универсальный класс определенными типами без добавления их с помощью декораторов - PullRequest
0 голосов
/ 22 октября 2019

Я хочу, чтобы класс расширял другой класс с определенным универсальным типом, где типы предоставляются декоратором. Я хочу передать типы из декоратора для использования в абстрактном классе MutatorBase. Причина, по которой я не могу просто пропустить декоратор и просто расширить абстрактный класс, заключается в том, что мне нужно получить конструктор предоставленных классов / типов.

Это то, чего я пытаюсь достичь:

type Constructor<T> = new (...args: any[]) => T;
type ObjectTuple = readonly Constructor<unknown>[];

function Mutator<T extends ObjectTuple>(...objs: T) {
    return <U extends MutatorBase<T>>(mutator: U) => {
      // do meta stuff
  };
}

abstract class MutatorBase<T extends ObjectTuple = []> {
    mutate(fn: (objs: T) => void) {
        // get objects
        // call fn(objs);
    }
}

class ObjectExample {
    data: number = 0;
}

@Mutator(ObjectExample)
class MutatorExample extends MutatorBase {

}

Это не работает, поскольку декоратор не может найти функцию mutate, даже если класс расширяет MutatorBase. Кроме того, типы, представленные в декораторе, вероятно, также не передаются.

Теперь MutatorExample extends MutatorBase<[typeof ObjectExample]> исправит проблему, но требует от меня предоставить объекты во второй раз, чего я хочу избежать.

Можно ли это сделать каким-либо образом?

...