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 단언보다 안전하고, 순수 타입 정의보다 편리하다. 특히 설정 객체나 상수 정의에서 타입 안정성과 개발 경험을 동시에 개선할 수 있었다.