Фон:
Я использовал перехватчик nest js, чтобы поместить возвращаемые данные из контроллера в свойство data
и добавить некоторые другие свойства. Теперь я хотел бы использовать @ApiOkResponse
, который бы отражал вложенные свойства.
Контроллер возвращает
{
prop1: 'val1',
prop2: 'val2'
}
После того, как он был перехвачен, он возвращает
data: {
prop1: 'val1',
prop2: 'val2'
},
addedProp: 'addedVal'
У меня также есть два класса:
// Have many variations of similar classes (for different controllers (types of data)
class NotYetIntercepted {
@ApiProperty()
prop1: string;
@ApiProperty()
prop2: string;
}
class Intercepted<T = any> {
@ApiProperty()
data: T;
@ApiProperty()
addedProp: string;
}
Challenge
Теперь я хотел бы добавить к своим контроллерам @ApiOkResponse({ type: Intercepted })
, но также как-то указать, что свойство data
класса Intercepted
должно иметь тип NotYetIntercepted
.
Я попытался создать Пользовательский декоратор, как это:
import { ValidateNested } from 'class-validator';
import { ApiProperty, ApiResponseOptions, ApiOkResponse } from '@nestjs/swagger';
import { Intercepted } from '@appnamespace/models';
import { Type } from 'class-transformer';
export const CustomApiOkResponse = (notYetIntercepted: Function, options?: Omit<ApiResponseOptions, 'type'>) => {
class InterceptedWithData extends Intercepted {
@ApiProperty()
@ValidateNested()
@Type(() => notYetIntercepted)
data: typeof notYetIntercepted;
}
return ApiOkResponse({
...options,
type: InterceptedWithData,
});
};
Это не сработало. Когда я удалил @Type() => notYetIntercepted)
и установил data
как data: notYetIntercepted
, это вроде как-то сработало (с предупреждением о машинописи), но переопределило все значения в моих документах на swagger до того, что было последним переданным значением (@CustomApiOkResponse(AnotherNotYetIntercepted)
).
Я знаю, что мог бы создать класс для каждого вложенного типа данных, но есть ли более чистое решение?
Спасибо за ваше время