상속 바인딩
필드 데코레이터는 부모 클래스에서 선언된 필드에도 함께 적용됩니다.
즉, 공통 필드를 기반 클래스에 한 번 정의하고 자식 클래스 전반에서 재사용할 수 있습니다.
예시
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
따라서 각 필드는 하나의 클래스에서만 선언해야 합니다. 필드의 바인딩 방식이나 검증 방식을 바꾸려면, 자식 클래스에서 재선언하지 말고 원래 선언된 곳에서 수정하세요.
참고
- 필드는 전체 프로토타입 체인에 걸쳐 수집되므로 여러 단계의 상속을 지원합니다.