TypeScript 5.8의 개선된 타입 추론과 실전 적용기

배경

사내 공통 컴포넌트 라이브러리를 TypeScript 5.8로 업그레이드하면서 몇 가지 타입 에러가 자동으로 해결되는 경험을 했다. 특히 조건부 타입을 사용하는 제네릭 유틸리티에서 추론 품질이 눈에 띄게 개선되었다.

개선된 부분

1. 조건부 타입 추론 정확도

기존에는 복잡한 조건부 타입에서 as 단언을 사용해야 했던 케이스들이 자동으로 추론되었다.

type ExtractProps<T> = T extends { props: infer P } ? P : never;

interface Component {
  props: { id: string; name: string };
}

// 5.7에서는 명시적 단언 필요했으나 5.8에서는 자동 추론
const props: ExtractProps<Component> = { id: '1', name: 'test' };

2. 배열 메서드 체이닝 타입

.map().filter() 같은 체이닝에서 타입이 더 정확하게 좁혀졌다.

const items = [{ value: 1 }, { value: null }, { value: 3 }];

const result = items
  .filter(item => item.value !== null)
  .map(item => item.value * 2); // number[] 정확히 추론

3. 제네릭 함수 오버로드

API 래퍼 함수에서 응답 타입 추론이 개선되어 불필요한 타입 파라미터 전달을 줄일 수 있었다.

function fetchData<T>(url: string, parser: (data: unknown) => T): Promise<T>;
function fetchData(url: string): Promise<unknown>;

function fetchData(url: string, parser?: any) {
  return fetch(url).then(res => res.json()).then(parser);
}

// 파서 함수로부터 자동으로 타입 추론
const userData = await fetchData('/api/user', (data) => data as User);

실전 적용

공통 폼 컴포넌트의 타입 정의를 단순화할 수 있었다. 기존 300줄 가량의 타입 선언을 200줄로 줄이면서도 타입 안정성은 오히려 향상되었다.

마이그레이션 자체는 큰 이슈 없었고, 오히려 기존에 우회했던 타입 단언들을 제거하는 작업이 주를 이뤘다. 빌드 속도도 체감상 5% 정도 빨라진 느낌이다.

결론

메이저 업데이트는 아니지만 실용적인 개선이 많았다. 특히 복잡한 타입 유틸리티를 많이 사용하는 프로젝트라면 업그레이드를 권장한다.