Проверка аргументов, переданных в общую мутацию в базовом распознавателе
Текущее поведение
- У меня есть базовый класс и несколько производных классов
- Есть BaseResolver, который наследуется резолверами производных классов.
- Внутри BaseResolver есть мутация create
- Эта мутация создания принимает разные аргументы в зависимости от производного класса.
- Существует create DTO для базового класса, create DTO производных классов, наследуемых от этого класса.
- Я передаю класс create DTO производного класса в BaseResolver, наследуя его в производных распознавателях.
Базовый резольвер:
export function BaseResolver<
T extends Type<BaseClass>,
createClassDto extends Type<CreateBaseClassDto>,
>(classRef: T, createClassArgsDtoRef: createClassDto): any
Производный резольвер:
@Resolver((of) => DerivedXClass)
export class DerivedXResolver extends BaseResolver(
DerivedXClass,
CreateDerivedXDto,
)
- Я указываю тип аргументов следующим образом:
async createMutation(
@Args({ type: () => createClassArgsDtoRef })
args: Type<CreateBaseClassDto>,
)
- Аргументы вообще не подтверждаются
Минимальный код воспроизведения
У него есть шаги для воспроизведения и ожидаемое поведение.
1 ответ
Я уверен, что, вероятно, есть более чистый способ сделать это, но что-то хакерское будет выглядеть так:
@Mutation(() => Boolean, { name: `create${classRef.name}` })
async createMutation(
@Args({ type: () => createClassArgsDtoRef })
args: // @ts-ignore
createClassArgsDtoRef,
) {
console.log('class is ', classRef.name);
console.log('args captured are ', args);
return true;
}
}
Typescript по сути не понимает, что то, что вы передаете здесь, на самом деле является ссылкой на класс, и его следует использовать как тип. Вероятно, есть лучший способ установить это, может быть, даже использовать декоратор настраиваемых параметров, но пока это работает и, насколько мне известно, удовлетворяет общему использованию типов.