TypeScript 4.0 업그레이드 후 타입 추론 개선 사항

업그레이드 배경

프로젝트의 TypeScript를 3.9에서 4.0으로 올렸다. 8월에 릴리즈된 지 한 달 정도 지나서 안정성을 확인하고 적용했다.

Variadic Tuple Types

가장 도움이 된 부분은 Variadic Tuple Types였다. 기존에는 가변 인자를 받는 함수의 타입을 제대로 표현하기 어려웠다.

// Before: 타입 안전성 없음
function concat(arr1: any[], arr2: any[]): any[] {
  return [...arr1, ...arr2];
}

// After: 제대로 타입 추론됨
function concat<T extends any[], U extends any[]>(
  arr1: T,
  arr2: U
): [...T, ...U] {
  return [...arr1, ...arr2];
}

const result = concat([1, 2], ['a', 'b']);
// type: [number, number, string, string]

Labeled Tuple Elements

API 응답 타입을 튜플로 정의할 때 레이블을 붙일 수 있게 되었다. 가독성이 확실히 좋아졌다.

// Before
type Range = [number, number];

// After
type Range = [start: number, end: number];

function setRange(...args: Range) {
  const [start, end] = args;
  // 파라미터 의미가 명확함
}

Class Property 타입 추론

생성자에서 할당하는 프로퍼티의 타입을 자동으로 추론하는 케이스가 늘었다. --noImplicitAny 옵션 사용 시에도 불필요한 타입 선언을 줄일 수 있었다.

class Cache {
  data; // 이제 constructor에서 추론됨
  
  constructor(initialData: Map<string, any>) {
    this.data = initialData; // Map<string, any>로 추론
  }
}

마이그레이션 이슈

대부분 문제없이 진행됐지만, 몇 가지 타입 체크가 엄격해진 부분이 있었다. 특히 && 연산자 사용 시 boolean이 아닌 타입에 대한 경고가 추가되어 일부 코드를 수정했다.

전체적으로 안정적인 업그레이드였다. 타입 추론이 강화되면서 명시적 타입 선언을 줄일 수 있어 코드가 깔끔해졌다.

TypeScript 4.0 업그레이드 후 타입 추론 개선 사항