Вывод типов
Три автоматических механизма: интерфейсы превращаются во встроенную схему, class-validator в JSON Schema, @HttpCode() в правильный статус.
DTO с типом-интерфейсом
Когда тип ответа или тела запроса задан через interface в TypeScript, а не через класс, Swagger не может подставить его в type:, потому что интерфейсы стираются в рантайме. nestjs-docfy замечает это сам и генерирует встроенный объект schema:, без единой правки в вашем коде.
// Your existing interface (no need to convert to a class)
export interface RegisterResponseDto {
success: boolean;
message: string | null;
}Что получается:
ApiResponse({
status: 201,
description: 'Created',
schema: {
type: 'object',
properties: {
success: { type: 'boolean' },
message: { type: 'string', nullable: true },
},
required: ['success'],
},
}),Поддерживаются: примитивы, объединения с null (T | null), массивы, вложенные интерфейсы и необязательные свойства (в required они не попадают).
Вывод из class-validator
Когда класс DTO размечен декораторами class-validator и при этом у его свойств нет @ApiProperty, nestjs-docfy выводит полноценную JSON Schema прямо из декораторов валидации. Размечать руками ничего не нужно.
// create-user.dto.ts
import { IsString, IsEmail, MinLength, IsOptional } from 'class-validator';
export class CreateUserDto {
@IsString()
@MinLength(2)
name: string;
@IsEmail()
email: string;
@IsOptional()
@IsString()
bio?: string;
}Что получается:
ApiBody({
schema: {
type: 'object',
properties: {
name: { type: 'string', minLength: 2 },
email: { type: 'string', format: 'email' },
bio: { type: 'string' },
},
required: ['name', 'email'],
},
}),Поддерживаемые декораторы
| Decorator |
|---|
@IsString |
@IsEmail |
@IsUrl |
@IsUUID |
@IsDateString |
@IsNumber |
@IsInt |
@IsBoolean |
@IsArray |
@Min |
@Max |
@MinLength |
@MaxLength |
@IsOptional |
Если хотя бы у одного свойства класса уже стоит @ApiProperty, вывод пропускается и подставляется type: ClassName. Вашу разметку Swagger никто не перезапишет.
Поддержка @HttpCode()
Декоратор @HttpCode() из NestJS переопределяет код ответа по умолчанию для обработчика маршрута. nestjs-docfy читает его сам и подставляет верный код в сгенерированный ApiResponse.
// users.controller.ts
@Post('logout')
@HttpCode(204)
logout(): void { ... }Что получается:
logout: [
ApiOperation({ summary: 'Logout' }),
ApiResponse({ status: 204, description: 'No Content' }),
],Без @HttpCode() действуют коды по умолчанию: 201 для @Post и 200 для всех остальных HTTP-методов.