Я хочу, чтобы класс расширял другой класс с определенным универсальным типом, где типы предоставляются декоратором. Я хочу передать типы из декоратора для использования в абстрактном классе 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]>
исправит проблему, но требует от меня предоставить объекты во второй раз, чего я хочу избежать.
Можно ли это сделать каким-либо образом?