TypeScript 5.2 satisfies 연산자로 타입 안정성 높이기
문제 상황
팀 프로젝트에서 설정 객체의 타입을 정의할 때 항상 고민이었다. as const를 쓰면 타입이 너무 좁아지고, 인터페이스만 쓰면 오타를 잡지 못했다.
const routes = {
home: '/',
usre: '/user', // 오타인데 컴파일 에러 없음
admin: '/admin'
} as const;
satisfies 연산자
TypeScript 5.2에서 추가된 satisfies를 적용했다. 타입 체크는 하되, 추론된 타입은 유지한다.
type Routes = {
home: string;
user: string;
admin: string;
};
const routes = {
home: '/',
user: '/user',
admin: '/admin'
} satisfies Routes;
// routes.home은 string이 아닌 '/' 타입으로 추론됨
// 동시에 Routes 구조를 만족하는지 검증됨
실전 활용
API 엔드포인트 정의에 특히 유용했다.
type ApiEndpoint = {
method: 'GET' | 'POST' | 'PUT' | 'DELETE';
path: string;
};
const endpoints = {
getUser: { method: 'GET', path: '/api/user' },
createPost: { method: 'POST', path: '/api/post' },
updatePost: { method: 'PUT', path: '/api/post/:id' }
} satisfies Record<string, ApiEndpoint>;
// endpoints.getUser.method는 'GET' 타입
// 하지만 ApiEndpoint 구조는 보장됨
결론
as 단언보다 안전하고, 순수 타입 정의보다 편리하다. 특히 설정 객체나 상수 정의에서 타입 안정성과 개발 경험을 동시에 개선할 수 있었다.