У меня есть ClassDecorator, который принимает неопределенное количество параметров конструктора (<T>: { new (...args: any[]) => T })
и на основании этого я хочу, чтобы этот класс потребовал реализации метода с параметрами, отражающими типы этих предоставленных конструкторов.
Mydecorator:
type Constructor<T> = new (...args: any[]) => T;
type ComponentArray = Array<Constructor<unknown>>;
export interface TSystem<TComps extends ComponentArray> {
handle: (...comps: TComps) => void;
}
export function System<TComps extends ComponentArray>(...comps: TComps) {
return (ctor: Constructor<Required<TSystem<TComps>>>) => {
// add metadata etc...
};
}
Пример:
class RandomComponent {
test1: string;
// implementation ...
}
class RandomComponent2 {
test2: string;
// implementation ...
}
@System(RandomComponent, RandomComponent2 /* etc ... */)
class TestSystem {
handle(r1: RandomComponent, r2: RandomComponent2 /* etc... */) {
// handle components ...
}
}
Я надеялся, что это сработает, однако компилятор выдаст мне эту ошибку:
Type '(comp: RandomComponent) => void' is not assignable
to type '(comps_0: typeof RandomComponent) => void'
Есть ли способ, которым я могуудалить typeof из интерфейса TSystem или, возможно, сделать это по-другому?Я хочу получить доступ к экземпляру класса, а не его тип.Или это просто ограничение системы типов TypeScript?