Перейти к основному содержимому

Наследование привязки

Декораторы полей также применяются к полям, объявленным в родительских классах.
Это позволяет определить общие поля один раз в базовом классе и повторно использовать их в дочерних классах.

Пример​

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

Поэтому каждое поле следует объявлять в одном классе. Чтобы изменить способ привязки или валидации поля, отредактируйте его там, где оно изначально объявлено, а не объявляйте его повторно в подклассе.

Примечания​

  • Поля собираются по всей цепочке прототипов, поэтому поддерживается несколько уровней наследования.