satisfies(TypeScript 4.9+)는 값이 어떤 타입을 만족하는지 검사하되, 값에서 추론된 구체적인 타입은 그대로 유지하는 연산자다.
| 방식 | 타입 검사 | 구체적 추론 유지 |
|---|---|---|
const x: T = … | ✅ | ❌ (T로 넓어짐) |
| 표기 없음 | ❌ | ✅ |
const x = … satisfies T | ✅ | ✅ |
type Colors = Record<string, string | [number, number, number]>
const a: Colors = { red: [255, 0, 0] }
a.red.map(v => v * 2) // ❌ string | 튜플로 넓어져 map을 모름
const b = { red: [255, 0, 0], green: '#0f0' } satisfies Colors
b.red.map(v => v * 2) // ✅ 튜플로 남아 있음- 설정 객체·라우트 표처럼 "키와 값 모양은 규칙대로 강제하고, 쓸 때는 정확한 타입이 필요한" 곳에 맞는다
as const satisfies T로 리터럴 타입까지 고정하면서 모양을 검사할 수 있다as T(타입 단언, Type Assertion)는 검사를 우회해 거짓말을 허용하지만,satisfies는 틀리면 에러를 낸다- 다만
as도 아무 타입으로나 바꿔 주지는 않는다. 원래 타입보다 더 구체적이거나 덜 구체적인 타입으로만 단언할 수 있어서"hello" as number는 에러다.expr as unknown as T처럼unknown(또는any)을 거쳐 두 번 단언하면 이 최소한의 검사까지 끈다. 단언은 컴파일 때 지워지므로 틀려도 런타임 오류가 나지 않는다
배경은 타입 추론과 타입 검사, 상수 객체를 유니언으로 바꾸는 패턴은 매핑된 타입과 keyof·enum과 as const 객체 참고.
출처: TypeScript 4.9 - The satisfies Operator · TypeScript Handbook - Type Assertions