본문 바로가기

javascript/typescript

[타입스크립트] Partial 유틸리티 타입

 예전에 nestjs 관련 강의를 듣다가 타입스크립트에 Partial 같은 유틸리티 타입이 존재한다는 사실을 알게 되었다.

Partial 유틸리티 타입은 대상이 되는 집합의 모든 프로퍼티를 선택적으로 변환한다.

예를 들어 Partial<Human> 이라면, Human의 모든 프로퍼티는 선택적(?을 이용하여 표기하는 것)으로 바뀐다.

 

구체적인 예시를 들어보자.

 

특정 유저의 정보를  변환하는 update 메서드가 있다. 이 메서드는 UserEntity라는 유저의 프로퍼티를 정의한 클래스를 input으로 받아들이는데, 해당 유저의 다양한 프로퍼티 중 실제로 업데이트가 필요한 프로퍼티만을 객체를 통해 전달하도록 동작하게 만들고 싶다. UserEntity 및 update는 아래와 같다.

 

유저의 정보를 가진 UserEntity의 내용
save 함수에서 Partial 유틸리티 메소드가 사용된 모습

 

이때 몇가지 제한을 걸자. UserEntity는 다른 entity들과 관련 없는 변수들(id, email, password, admin)의 정보를 새로운 유저를 생성할 때 필요로 하므로, 이 정보들을 입력받아야 한다(create시 모든 정보가 "필수적으로" 필요하다). 반대로 update 메서드에서는 특정 프로퍼티만을 넘길 수 있도록 구현해야 한다.

 

위와 같은 경우, UserEntity의 모든 값을 선택적으로 지정하는 새로운 entity를 생성한다면 문제를 해결할 수 있다. 그러나 굳이 이를 만들 필요 없이 단순히 Partial타입으로 선언하면 같은 동작을 더 간단하게 구현할 수 있다.

 

Partial<UserEntity>를 이용하여 UserEntity의 모든 값을 선택적으로 받을 수 있다.

 

  Partial 유틸리티 타입은 위와 같이 모든 값을 선택적으로 받을 수 있게 한다. 위 경우 유저의 정보인 admin, email. id 등의 프로퍼티 등 기존 UserEntity의 값을 선택적으로 입력할 수 있다. 만약 유저의 특정 정보만을 수정해야 하거나, 많은 설정 중 일부 설정만 바꾸어야 하는 상황이 존재한다면, Partial은 좋은 답이 될 것 같다.