NestJS에서 PartialType(), PickType(), OmitType(), IntersectionType()의 사용
CRUD (Create / Read / Update / Delete)와 같은 기능을 구축할 때 기본 엔터티 유형에서 변형을 구성하는 것이 유용하다.
Nest는 이 작업을 보다 편리하게 만들기 위해 유형 변환을 수행하는 여러 유틸리티 기능을 제공한다.
입력 유효성 검사 유형(DTO)을 빌드할 때 동일한 유형에서 생성 및 업데이트 변형을 빌드하는 것이 유용한 경우가 많다 .
예를 들어 생성 변형은 모든 필드를 요구할 수 있지만 업데이트 변형은 모든 필드를 선택 사항으로 만들 수 있다.
Nest는 PartialType()이 작업을 더 쉽게 만들고 상용구를 최소화하기 위한 유틸리티 기능을 제공한다.
1. PartialType()함수는 입력 유형의 모든 속성이 옵션으로 설정된 유형(클래스)을 반환한다.
예를 들어 다음과 같은 생성 유형이 있다고 가정하자.
export class userStrongInfo {
@ApiProperty({ type: Number })
@IsNumber()
level: number;
@ApiProperty({ type: Number })
@IsNumber()
magicPower: number;
@ApiProperty({ type: Number })
@IsNumber()
swordPower: number;
}
기본적으로 이러한 필드는 모두 필수입니다.
동일한 필드가 있지만 각 필드가 선택 사항인 유형을 생성하려면 PartialType()클래스 참조(userStrongInfo)를 인수로 전달한다.
export class PartialTypeClass extends PartialType(userStrongInfo) {}
결과값 (Swagger에서 확인한 클래스 구현물)

* 결과적으로 PartialTypeClass의 필드들은 속성이 모두 옵션으로 설정된 새로운 클래스 PartialTypeClass이다.
2. PickType()함수는 입력 유형에서 속성 집합을 선택하여 새 유형(클래스)을 생성한다.
예시 코드)
export class PickTypeClass extends PickType(userStrongInfo, ['level'] as const) {}
결과값 (Swagger에서 확인한 클래스 구현물)

* 결과적으로 level만 선택되어 생성된 새로운 클래스 PickTypeClass이다.
3. OmitType()함수는 입력 유형에서 모든 속성을 선택한 다음 특정 키 세트를 제거하여 유형을 구성한다.
예시 코드)
export class OmitTypeClass extends OmitType(userStrongInfo, ['magicPower'] as const) {}
결과값 (Swagger에서 확인한 클래스 구현물)

* 결과적으로 magicPower가 제거되고 생성된 새로운 클래스 OmitTypeClass이다.
4. IntersectionType()함수는 두 가지 유형을 하나의 새로운 유형(클래스)으로 결합한다.
예시 코드)
export class userStrongInfo {
@ApiProperty({ type: Number })
@IsNumber()
level: number;
@ApiProperty({ type: Number })
@IsNumber()
magicPower: number;
@ApiProperty({ type: Number })
@IsNumber()
swordPower: number;
}
export class userBaseInfo {
@ApiProperty({ type: String })
@IsString()
name: string;
@ApiProperty({ type: Number })
@IsNumber()
age: number;
@ApiProperty({ type: Number })
@IsNumber()
major: number;
}
두 유형의 모든 속성을 결합하여 새 유형을 생성할 수 있다.
export class UserInfo extends IntersectionType(
userBaseInfo,
userStrongInfo,
) {}
결과값 (Swagger에서 확인한 클래스 구현물)

* 결과적으로 userBaseInfo와 userStrongInfo가 결합되어 생성된 새로운 클래스 UserInfo 이다.
5. 유형 매핑 유틸리티 함수는 함께 사용 가능하다.
PartialType과 OmitType을 같이 사용하는 예시 코드)
export class PartialTypeOmitClass extends PartialType(
OmitType(userStrongInfo, ['swordPower', 'magicPower'] as const),
) {}
결과값 (Swagger에서 확인한 클래스 구현물)

* 결과적으로 swrodPower와 magicPower가 제거되고 나머지 속성이 옵션으로 설정되어 생성된 새로운 클래스 PartialTypeOmitClass 이다.
물론 위 예제 모두 새로운 속성이 추가가 가능하다.
예시 코드)
export class UserInfo extends IntersectionType(userBaseInfo, userStrongInfo) {
@ApiProperty({ type: Date })
@IsDateString()
playTime: Date;
}
결과값 (Swagger에서 확인한 클래스 구현물)

'개발 프레임워크 > NestJS' 카테고리의 다른 글
[Mongoose] Model.events, Model관련 Error 처리 (0) | 2023.03.01 |
---|---|
[NestJS] 배열 구문 분석 및 유효성 검사, DTO 검증 (0) | 2023.02.23 |
[NestJS] MongoDB 컬렉션에 문서(객체)를 삽입하기 (0) | 2023.02.21 |
[NestJS] 데이터 추출(페이지네이션), skip(), hasNext(), next() (0) | 2023.02.20 |
[NestJS] 개발환경 구성 (0) | 2023.02.20 |
댓글