TypeScript 4.4의 Control Flow Analysis 개선으로 타입 가드 리팩토링
문제 상황
프로젝트에서 API 응답 처리 로직에 타입 단언(as)이 과하게 사용되고 있었다. TypeScript가 타입을 제대로 추론하지 못해 개발자가 수동으로 타입을 명시해야 하는 경우가 많았다.
interface SuccessResponse {
status: 'success';
data: User[];
}
interface ErrorResponse {
status: 'error';
message: string;
}
type ApiResponse = SuccessResponse | ErrorResponse;
function handleResponse(response: ApiResponse) {
const isSuccess = response.status === 'success';
if (isSuccess) {
// TypeScript 4.3에서는 여기서 타입 추론 실패
return (response as SuccessResponse).data;
}
}
TypeScript 4.4 업그레이드
4.4로 업그레이드하면서 Control Flow Analysis가 개선되어 aliased conditions를 제대로 인식하게 되었다.
function handleResponse(response: ApiResponse) {
const isSuccess = response.status === 'success';
if (isSuccess) {
// 타입 단언 불필요
return response.data; // response는 SuccessResponse로 추론됨
}
return null;
}
실제 적용 사례
프로젝트 전체를 검색해서 타입 단언이 사용된 곳을 찾았고, 약 30% 정도를 제거할 수 있었다. 특히 조건을 변수로 추출해서 재사용하는 패턴에서 효과가 컸다.
// 리팩토링 전
if (user && user.role === 'admin') {
const adminUser = user as AdminUser;
adminUser.permissions.forEach(...);
}
// 리팩토링 후
const isAdmin = user?.role === 'admin';
if (isAdmin && user) {
user.permissions.forEach(...); // AdminUser로 정확히 추론
}
결론
TypeScript 컴파일러의 개선으로 코드가 더 안전해졌다. 타입 단언은 타입 시스템의 구멍이 될 수 있기 때문에, 컴파일러가 스스로 추론할 수 있게 하는 것이 좋다. 다만 4.4의 빌드 속도가 약간 느려진 것은 아쉬운 부분이다.