TypeScript 5.8의 개선된 타입 추론으로 불필요한 타입 단언 제거하기
문제 상황
회사 프로젝트를 TypeScript 5.8로 업그레이드하면서 기존 코드를 점검하던 중, 불필요한 타입 단언들이 눈에 띄었다. 예전 버전에서는 타입 추론이 제대로 되지 않아 as 키워드를 사용해야 했던 부분들이 이제는 자동으로 추론되고 있었다.
개선된 케이스들
1. 제네릭 함수의 반환 타입 추론
// Before (TS 5.6)
function filterNonNull<T>(arr: (T | null)[]): T[] {
return arr.filter(item => item !== null) as T[];
}
// After (TS 5.8)
function filterNonNull<T>(arr: (T | null)[]): T[] {
return arr.filter(item => item !== null); // 타입 단언 불필요
}
2. 객체 메서드 체이닝
const result = await fetchUser(userId)
.then(user => user.posts)
.then(posts => posts.filter(p => p.published));
// 이전에는 각 단계에서 타입 단언이 필요했으나 이제는 자동 추론
3. 조건부 타입과 함께 사용하는 제네릭
type ApiResponse<T> = T extends undefined ? never : { data: T };
function processResponse<T>(response: ApiResponse<T>) {
// response.data의 타입이 정확하게 추론됨
return response.data;
}
실제 개선 효과
전체 코드베이스를 검토한 결과 약 147개의 불필요한 타입 단언을 제거할 수 있었다. 특히 유틸리티 함수들과 API 응답 처리 로직에서 개선이 두드러졌다.
타입 단언을 제거하면서 실제로 타입이 잘못 지정되어 있던 케이스 3건도 발견했다. 기존에는 as로 강제로 타입을 지정해서 문제를 숨기고 있었던 것이다.
결론
TypeScript의 타입 추론 개선은 단순히 코드를 줄이는 것 이상의 의미가 있다. 타입 안정성을 높이고 잠재적 버그를 컴파일 타임에 발견할 수 있게 해준다. 주기적으로 TypeScript를 업그레이드하고 불필요한 타입 단언을 제거하는 작업을 권장한다.