TypeScript 5.8의 Enum 타입 추론 개선 사항

문제 상황

프로젝트의 TypeScript를 5.7에서 5.8로 업그레이드했다. 기존에 any로 우회하던 enum 관련 코드가 제대로 타입 추론되기 시작했다.

enum Status {
  Pending = 'PENDING',
  Active = 'ACTIVE',
  Completed = 'COMPLETED'
}

function updateStatus(status: Status) {
  const statusMap = {
    [Status.Pending]: '대기중',
    [Status.Active]: '진행중',
    [Status.Completed]: '완료'
  };
  
  return statusMap[status]; // 기존: any 반환, 5.8: string 반환
}

개선 내용

5.8부터는 enum을 객체 키로 사용할 때 타입 추론이 정확해졌다. statusMap의 타입이 Record<Status, string>으로 제대로 추론된다.

type StatusMap = {
  [K in Status]: string;
};

const statusMap: StatusMap = {
  [Status.Pending]: '대기중',
  [Status.Active]: '진행중',
  [Status.Completed]: '완료'
};

const enum 고려사항

const enum은 컴파일 시 인라인되어 번들 크기를 줄일 수 있지만, 런타임에 객체가 존재하지 않아 Object.values() 같은 작업이 불가능하다.

const enum Direction {
  Up,
  Down
}

// 컴파일 후: const x = 0;
const x = Direction.Up;

일반 enum은 런타임 객체로 남아 있어 동적 처리가 필요한 경우 유용하다. 우리 프로젝트는 API 응답과 enum을 매핑하는 경우가 많아 일반 enum을 유지하기로 했다.

결론

TypeScript 버전 업그레이드로 타입 안정성이 향상되었고, 기존의 any 우회 코드를 정리할 수 있었다. enum 사용 시 const enum과 일반 enum의 트레이드오프를 명확히 이해하고 선택하는 것이 중요하다.