TypeScript 4.7 satisfies 연산자로 타입 안전성 개선하기
문제 상황
프로젝트에서 설정 객체의 타입을 보장하면서도 자동완성을 유지하고 싶었다. 기존에는 as const나 타입 단언을 사용했는데, 이 방식은 타입 체크를 우회하거나 타입 정보를 잃는 문제가 있었다.
type Color = 'red' | 'green' | 'blue';
const palette = {
primary: 'red',
secondary: 'green'
} as const;
// 타입은 보장되지만 오타가 있어도 에러가 안 남
const wrong = {
primary: 'redd' // 컴파일 에러 없음
} as const;
satisfies 연산자
TypeScript 4.7에서 추가된 satisfies를 사용하면 타입을 검증하면서도 추론을 유지할 수 있다.
type Config = {
primary: Color;
secondary: Color;
};
const palette = {
primary: 'red',
secondary: 'green'
} satisfies Config;
// 타입 에러 발생
const wrong = {
primary: 'redd' // Error: Type '"redd"' is not assignable
} satisfies Config;
// 추론은 그대로 유지
palette.primary.toUpperCase(); // 가능
실무 적용 사례
API 엔드포인트 설정에 적용했다. 기존에는 타입과 실제 값의 불일치를 런타임에 발견했는데, satisfies로 컴파일 타임에 잡을 수 있게 됐다.
type Endpoint = {
method: 'GET' | 'POST' | 'PUT' | 'DELETE';
path: string;
};
const endpoints = {
getUser: {
method: 'GET',
path: '/api/users'
},
createUser: {
method: 'POST',
path: '/api/users'
}
} satisfies Record<string, Endpoint>;
정리
satisfies는 타입 안전성과 추론 사이의 균형을 잘 맞춰준다. 특히 설정 객체나 상수 테이블처럼 정적인 데이터 구조에 유용하다. 팀 내에서도 점진적으로 적용 중이다.