frontendtypescript
TypeScript satisfies, as를 쓰기 전에
✨ AI 요약
긴 글, 핵심만 먼저 — 이 글을 3줄로 정리해드려요.
조회 0
설정 객체에 타입을 붙이는 세 가지 방법이 있다.
type Config = Record<string, { url: string; retry?: number }>;
// 1. 타입 주석 — 키 자동완성이 죽는다
const config1: Config = {
github: { url: "https://api.github.com" },
};
config1.github; // 타입은 { url; retry? } — 정확하지만
config1.anything; // 이것도 통과해버린다 (Record라서)
// 2. as — 검사를 끈다
const config2 = { github: { url: 123 } } as Config; // url이 number인데 통과!
// 3. satisfies — 검사하되 추론은 유지
const config3 = {
github: { url: "https://api.github.com" },
} satisfies Config;
config3.github.url; // string으로 정밀 추론
config3.naver; // ✅ 컴파일 에러 — 없는 키
핵심 차이
- 주석(
:): 값을 넓은 타입으로 "승격"시킨다. 리터럴 정보가 사라진다 as: "내 말을 믿어"다. 틀려도 컴파일러가 입을 다문다satisfies: "이 형태를 만족하는지 검사만 해줘, 추론은 그대로 둬"
실전에서 빛나는 곳
const routes = {
home: "/",
post: "/posts/[id]",
tag: "/tags/[slug]",
} satisfies Record<string, `/${string}`>;
type RouteKey = keyof typeof routes; // "home" | "post" | "tag" — 리터럴 유지!
as const와도 잘 섞인다. 검사와 추론을 둘 다 챙기고 싶을 때, as를 치려던 손을 멈추고 satisfies를 먼저 떠올리자. as는 정말로 컴파일러보다 내가 더 아는 경우(외부 데이터 파싱 직후 등)에만.