우당탕탕

TypeScript의 satisfies 연산자와 타입 주석의 차이 및 런타임 검증 경계 본문

언어/JavaScript

TypeScript의 satisfies 연산자와 타입 주석의 차이 및 런타임 검증 경계

모찌모찝 2026. 10. 16. 18:12

TypeScript 4.9 버전부터 도입된 satisfies 연산자는 타입 주석(type annotation)과는 달리, 표현식의 타입이 특정 타입과 호환되는지 검증하면서도 표현식의 구체적인 타입 정보를 유지할 수 있게 해준다. 이는 타입 주석을 사용할 때 발생하는 타입 정보 손실 문제를 해결한다.

satisfies 연산자와 타입 주석의 차이

  • 타입 주석: 변수나 상수에 타입을 명시하면, 해당 타입으로 타입이 고정되어 표현식의 구체적인 타입 정보가 축소될 수 있다. 예를 들어, Record<Colors, string | RGB> 타입 주석을 사용하면 각 프로퍼티가 string | RGB 타입으로 제한되어, 구체적인 타입 추론이 어려워진다.
  • satisfies 연산자: 표현식이 특정 타입을 만족하는지 검증하지만, 표현식의 구체적인 타입 정보는 그대로 유지한다. 따라서 프로퍼티별로 더 구체적인 타입 추론이 가능하며, 오타나 누락된 키를 타입 수준에서 검출할 수 있다.

예시

type Colors = "red" | "green" | "blue";
type RGB = [red: number, green: number, blue: number];

const palette = {
  red: [255, 0, 0],
  green: "#00ff00",
  blue: [0, 0, 255]
} satisfies Record<Colors, string | RGB>;

const greenNormalized = palette.green.toUpperCase(); // green은 string 타입으로 추론되어 toUpperCase 사용 가능

위 코드는 정상 입력 예제입니다. 키 이름을 blue 대신 bleu로 잘못 쓰면 컴파일 오류가 발생해야 합니다. TypeScript 5.1.6의 strict 옵션에서 정상 예제의 문자열 메서드 호출, 타입 주석의 유니온 타입 오류, 잘못된 키의 오류를 각각 검사했습니다. Node.js 실행에서 정규화 결과 #00FF00도 확인했습니다. 4.9는 기능 도입 버전이고 실제 재현에 사용한 컴파일러 버전은 5.1.6입니다.

런타임 검증과 타입 시스템의 경계

TypeScript의 타입 시스템은 컴파일 타임에 타입 안전성을 제공하지만, 런타임에서는 타입 정보가 제거되어 실제 값에 대한 검증은 수행하지 않는다. 따라서 satisfies 연산자나 타입 주석 모두 런타임 검증을 수행하지 않으며, 런타임 타입 검증이 필요할 경우 별도의 검증 로직을 작성해야 한다.

요약

  • satisfies 연산자는 타입 호환성 검증과 구체적 타입 유지라는 두 가지 요구를 동시에 충족한다.
  • 타입 주석은 타입을 고정하여 구체적 타입 정보를 잃을 수 있다.
  • TypeScript 타입 시스템은 컴파일 타임 검증에 한정되며, 런타임 검증은 별도의 코드가 필요하다.

참고 자료

이어서 볼 글

TypeScript 공식 문서 — Erased Types

Comments