TypeScript 5.0 베타 - satisfies 연산자로 타입 추론 개선하기
배경
프로젝트에서 설정 객체를 다루다 보면 타입 안정성과 타입 추론 사이에서 트레이드오프가 발생했다. as const를 쓰면 추론은 정확하지만 타입 체크가 안 되고, 명시적 타입 선언을 하면 체크는 되지만 추론이 넓어지는 문제였다.
TypeScript 5.0 베타에 추가된 satisfies 연산자가 이 문제를 해결해준다.
기존 방식의 문제
type Colors = 'red' | 'green' | 'blue';
const palette: Record<Colors, string | number[]> = {
red: '#ff0000',
green: [0, 255, 0],
blue: '#0000ff'
};
// 타입이 string | number[]로 추론됨
palette.red.toUpperCase(); // 에러: string | number[] 타입에 toUpperCase 없음
타입 선언을 하면 모든 값이 유니온 타입으로 추론되어 실제 사용할 때 불편했다.
satisfies 적용
const palette = {
red: '#ff0000',
green: [0, 255, 0],
blue: '#0000ff'
} satisfies Record<Colors, string | number[]>;
// 정확한 타입 추론
palette.red.toUpperCase(); // 정상 작동
palette.green[0]; // 정상 작동
타입 체크는 하되 각 값의 실제 타입을 유지한다. 타입 안정성과 편의성을 동시에 얻을 수 있었다.
API 응답 타입 처리
실무에서 가장 유용했던 케이스는 API 응답 객체였다.
type ApiResponse = {
status: number;
data: unknown;
};
const response = {
status: 200,
data: { userId: 123, name: 'John' }
} satisfies ApiResponse;
// data의 실제 구조를 유지하면서 타입 체크
response.data.userId; // 정상 접근 가능
정리
TypeScript 5.0은 2023년 3월 정식 릴리즈 예정이지만, 베타 버전으로 먼저 적용해봤다. satisfies는 작지만 실용적인 개선이다. 타입 시스템이 복잡해질수록 이런 세밀한 제어가 중요해진다는 걸 느꼈다.