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는 타입 안전성과 추론 사이의 균형을 잘 맞춰준다. 특히 설정 객체나 상수 테이블처럼 정적인 데이터 구조에 유용하다. 팀 내에서도 점진적으로 적용 중이다.