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이 아닌 타입에 대한 경고가 추가되어 일부 코드를 수정했다.
전체적으로 안정적인 업그레이드였다. 타입 추론이 강화되면서 명시적 타입 선언을 줄일 수 있어 코드가 깔끔해졌다.