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는 작지만 실용적인 개선이다. 타입 시스템이 복잡해질수록 이런 세밀한 제어가 중요해진다는 걸 느꼈다.