TypeScript-тип на @Body() не проверяет тело запроса
Контроллер на NestJS:
interface CreateOrderDto {
amount: number;
currency: string;
}
@Post()
create(@Body() dto: CreateOrderDto) {
return this.orders.create(dto);
}
Клиент прислал {"amount": "сто", "currency": 5, "isAdmin": true}. Проект собирается без ошибок, тесты зелёные, но в базе появляются заказы с суммой-строкой. Что здесь верно?
- Типы TypeScript стираются при компиляции: в рантайме проверки нет, нужен класс DTO с валидацией
- NestJS приводит тело к типу из аннотации, ошибка в том, что использован `interface` вместо `type`
- Проблема в том, что не включён строгий режим компилятора: со строгими настройками такое тело будет отклонено на входе
- Достаточно описать схему тела в Swagger-декораторах: сгенерированный по ним контракт валидирует входящие запросы сам
