유틸리티 타입 ReplacePropertyValue
라이브러리를 개발하다보면 특정 객체 타입의 프로퍼티는 유지하되, 일부 프로퍼티 값의 타입을 바꿔줘야 하는 경우가 생긴다. 특히 오버라이드 패턴을 사용해 메서드의 일부 동작이 변경되는 경우가 여기 포함된다. 타입스크립트에서는 주로 Omit Pick Partial 등의 유틸리티 타입을 사용해 이런 오버라이드를 구현한다.
type ReducerStore = Omit<Store<T>, "setStore"> & { setStore: Dispatcher }
하지만 Omit과 & 연산자 등을 사용해 타입을 선언하다보니 이 타입이 뭘 하고 있는 건지 한 눈에 알기가 어렵다. 나는 이러한 문제를 해결하기 위해 ReplacePropertyValue라는 유틸리티 타입을 라이브러리에 도입했다.
type ReplacePropertyValue< T extends object, U extends { [x in keyof T]?: unknown } > = Omit<T, keyof U> & U;
ReplacePropertyValue 타입은 기존 타입 T에서 특정 속성 집합 U의 키를 제거한 후, U와 병합하여 수정된 타입을 반환한다. 사실 하는 일은 처음에 작성했던 예시 코드와 정확히 동일하다. 하지만 이 타입을 사용하면 그 이름 덕분에 따로 주석을 남기지 않아도 타입을 작성한 개발자의 의도를 명확히 드러낼 수 있다. '프로퍼티 값의 타입만 바꿔치기 하겠다는' 의도를 말이다.
type ReducerStore = Omit<Store<T>, "setStore"> & { setStore: Dispatcher } type ReducerStore = ReplacePropertyValue<Store<T>, { setStore: Dispatcher }>
블로그의 정보
Ayden's journal
Beard Weard Ayden