nestjs mapped type

양진영·2023년 2월 13일
0

nestJs

목록 보기
8/10

프로그래밍을 하다보면 반복적으로 설정해 줘야하는것들이 있다. 그런것들은 손가락만 아프게하고 시간만 낭비하게 한다. 그러한 반복작업의 대표적인 예시는 dto 작성이었다. 그냥 dto쓰는것도 귀찮은데 swagger라도 붙여주려면 또 entity에서 했던것 그대로 반복해야한다. 생산성 매우 떨어진다. 그래서 오늘 포스팅 할 내용은 작지만 많은 초보 개발자들에게 도움이 되리라고 생각한다.

typescript에는 utility타입이 존재한다. 이들은 객체를 타입으로 입혀줄때 내가 원하는데로 타입을 가공할수있다. 말이 조금 어려웠으나 쉽게 풀어쓰면 타입을 선택적으로 사용하게 만들어 준다고 설명할수 있겠다.

interface Example{
	name:string
    age:number
	address:string
    firstName:string
    lastName:string
}

위와같은 interface에서 몇가지만 골라서 사용하고 싶다면 PickType<Example,'name'|'age'> 처럼 특정 키만 골라서 사용할수도 있고 Partial처럼 모든 키를 사용할수도 하지않을수도 있게 해주는 옵션널한 형태로 잡아줄수도 있다. 마지막으로 Omit<Example,'address'> 처럼 특정 키만 빼줄수도 있다.

이것만 보고도 중복 코드를 어떻게 잡아야 하는 분들도 계실테지만 나는 아니었기 때문에 나와같은 분들을 위해 약간의 보충설명을 좀더 써 내려 가보겠다.

user.entity.ts
 import { ApiProperty } from '@nestjs/swagger';
import { IsEmail, IsNotEmpty, IsString } from 'class-validator';
import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';

@Entity()
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @IsEmail()
  @IsNotEmpty()
  @ApiProperty({
    required: true,
    description: 'email',
    example: 'abc@gmail.com',
  })
  @Column()
  email: string;

  @IsString()
  @IsNotEmpty()
  @ApiProperty({
    required: true,
    description: 'nickanme',
    example: 'cookieyam',
  })
  @Column()
  nickname: string;

  @IsString()
  @IsNotEmpty()
  @ApiProperty({
    required: true,
    description: 'write first name',
    example: 'Jinyoung',
  })
  @Column()
  firstName: string;

  @IsString()
  @IsNotEmpty()
  @ApiProperty({
    required: true,
    description: 'write last name',
    example: 'Yang',
  })
  @Column()
  lastName: string;

  @IsString()
  @IsNotEmpty()
  @ApiProperty({
    required: true,
    description: 'wrtie password',
    example: '1q2w3e4r',
  })
  @Column()
  password: string;
}

위와같은 entity를 갖는 모듈에서 유저를 생성할때 쓰이는 dto를 만드려면 dto로 전달할 property만 따로 골라 다시 하나하나 다 적어줬어햐 했다. 적어도 난 기존에 그렇게 만들었다. 하지만 ts의 기능처럼 nestjs에서 mappedType이라는 이름으로 utility 타입 비스무리 한것을 만들수가있다.

 import { PickType } from '@nestjs/swagger';
import { User } from '../entities/user.entity';

export class CreateUserDto extends PickType(User, [
  'email',
  'firstName',
  'lastName',
  'nickname',
  'password',
] as const) {}

user class를 extends하여 상속받지만 PickType으로 상속받고자 하는 키만 가져와 상속받을수 있게 하였다.

이번에 사용한것은 PickType이었지만 물론 Omit도 Partial도 지원가능하다. nestjs공식문서에 나와 있는 내용이라 보고싶은 분들은 한번씩 가서 살펴보는것도 나쁘지않을것 같다.
https://docs.nestjs.com/graphql/mapped-types#mapped-types

profile
왜? 라는 질문을 중요시하는 서버 개발자입니다

0개의 댓글