Наследование привязки
Декораторы полей также применяются к полям, объявленным в родительских классах.
Это позволяет определить общие поля один раз в базовом классе и повторно использовать их в дочерних классах.
Пример
class BaseRequest {
@Body()
@Length(10)
id!: string
}
class CreateUserRequest extends BaseRequest {
@Body()
@OneOf(["admin", "user"])
role!: string
}
Результат
CreateUserRequest будет иметь следующие поля:
-
id : унаследовано от
BaseRequest -
role : определено в
CreateUserRequest
Когда вы передаёте CreateUserRequest в bindingCargo, и унаследованное id, и локально объявленное role привязываются и проверяются вместе.
Повторное объявление унаследованного поля
Повторное объявление унаследованного поля в дочернем классе не заменяет определение родительского класса — декораторы обоих классов объединяются на одном поле. Повторное применение декоратора источника таким образом (например, @Body() на поле, которое родительский класс уже получает через @Body()) приводит к ошибке схемы:
Update.id: @Body + @Body cannot be combined; pick a single source
Поэтому каждое поле следует объявлять в одном классе. Чтобы изменить способ привязки или валидации поля, отредактируйте его там, где оно изначально объявлено, а не объявляйте его повторно в подклассе.
Примечания
- Поля собираются по всей цепочке прототипов, поэтому поддерживается несколько уровней наследования.