TypeScript 4.2 Template Literal Types로 타입 안전성 높이기

배경

이번 달 초 TypeScript 4.2가 출시되면서 Template Literal Types가 추가되었다. 기존에는 문자열 리터럴 타입의 조합을 만들기 어려웠는데, 이제 타입 레벨에서 문자열 조합이 가능해졌다.

우리 프로젝트에서는 API 엔드포인트 경로와 이벤트 이름을 문자열로 관리하면서 오타로 인한 버그가 종종 발생했다. 이를 개선하기로 했다.

적용 사례

API 엔드포인트 타입

type HTTPMethod = 'GET' | 'POST' | 'PUT' | 'DELETE';
type Resource = 'users' | 'posts' | 'comments';
type Endpoint = `${HTTPMethod} /api/${Resource}`;

// 타입 체크가 동작한다
const validEndpoint: Endpoint = 'GET /api/users'; // OK
const invalidEndpoint: Endpoint = 'GET /api/items'; // Error

이벤트 네이밍

type EventTarget = 'button' | 'modal' | 'form';
type EventAction = 'click' | 'open' | 'close' | 'submit';
type EventName = `${EventTarget}:${EventAction}`;

function trackEvent(eventName: EventName) {
  analytics.track(eventName);
}

trackEvent('button:click'); // OK
trackEvent('button:hover'); // Error: Type '"button:hover"' is not assignable

실무 효과

배포 후 모니터링 결과, 이벤트 트래킹 관련 에러가 눈에 띄게 줄었다. 특히 새로 합류한 팀원이 자동완성으로 정확한 이벤트 이름을 사용할 수 있게 되어 온보딩 시간도 단축되었다.

다만 타입 조합이 많아지면 컴파일 속도가 느려지는 이슈가 있어, 과도하게 사용하지 않도록 주의가 필요하다.

마무리

Template Literal Types는 문자열 기반 API를 다룰 때 타입 안전성을 크게 향상시킨다. 기존에 유니온 타입으로 일일이 나열하던 것을 조합으로 표현할 수 있어 유지보수도 편해졌다. TypeScript 4.2 업그레이드를 고려해볼 만하다.

TypeScript 4.2 Template Literal Types로 타입 안전성 높이기