Tunko Development Diary

[NestJS][GraphQL] mapped-types 정리 본문

Development/Nest.js

[NestJS][GraphQL] mapped-types 정리

Tunko 2021. 4. 14. 06:39

Documentation | NestJS - A progressive Node.js framework

Nest 에서 제공하는 기능인 Mapped-type은
CRUD 와 같은 기능을 구축할떄 Entity 클래스의 유형을 변경하는 기능이다.

@nestjs/graphql 패키지에서 제공한다.

기능의 종류

  • Partial : 부분적인, 불완전한
  • Pick : 고르다, 선택하다, 뽑다
  • Omit : 빠뜨리다, 누락[제외]시키다, 생략하다
  • Intersection : 교차로

예제 class

@InputType()
class CreateUserInput {
  @Field()
  email: string;

  @Field()
  password: string;

  @Field()
  firstName: string;
}

Partial

Entity 모든 필드를 선택사항으로 바꾼다.
동일한 Entity유형에서 변형을 만들어 부분적으로 선택하여 형태를 전달 할 수 있도록한다.

@InputType()
export class UpdateUserInput extends PartialType(CreateUserInput) {}

만약 부모 클래스의 타입이 @ObjectType 으로 선언 되어있고
PartialType이 다른 타입(예를들어 @InputType) 이라면 두번째 인자에 해당 타입을 추가해주어야 한다.

@InputType()
export class UpdateUserInput extends PartialType(CreateUserInput, InputType) {}

Pick

Pick 은 해당 입력 유형해서 속성 집합을 선택하여 새로운 유형(클래스)를 생성한다.

@InputType()
export class UpdateEmailInput extends PickType(CreateUserInput, ['email'] as const) {}

즉, 쉽게 설명하면. 기존 형태에서 특정 필드만 꼭 골라쓰는 형태로 만들어준다는 이야기다.

Omit

Omit 는 입력 유형에서 모든 속성을 선택한다음 특정 필드만 제거하여 유형을 구성한다.
즉, Pick 과 반대이다.

@InputType()
export class UpdateUserInput extends OmitType(CreateUserInput, ['email'] as const) {}

위코드를 해석하면 CreateUserInput 에 모든 필드를 입력유형으로 사용하지만 email 필드만 제외한다 라는의미이다.

Intersection

두개의 Entity 를 하나의 타입으로 만들어 사용한다.

@InputType()
class CreateUserInput {
  @Field()
  email: string;

  @Field()
  password: string;
}

@ObjectType()
export class AdditionalUserInfo {
  @Field()
  firstName: string;

  @Field()
  lastName: string;
}
@InputType()
export class UpdateUserInput extends IntersectionType(CreateUserInput, AdditionalUserInfo) {}

Composition

@InputType()
export class UpdateUserInput extends PartialType(
  OmitType(CreateUserInput, ['email'] as const),
) {}

위와같이 구성을 포함시켜 사용할 수 있다.

UpdateUserInput 타입에 있는걸 선택사항으로 만드는데 , 이중에 email 을 제외하고 선택사항을 만들겠다는 코드이다.

즉, 입력유형을 email필드를 제외한 것을 선택사항으로 하겠다 라는 의미이다.

반응형
Comments