as const는 값을 넓히는 대신 가장 구체적인(리터럴), 깊이 readonly한 타입을 추론하도록 TypeScript에 지시하는 **const 단언(const assertion)**입니다.
ts
a = ;
obj = { : };
arr = [, ];
b = ;
obj2 = { : } ;
arr2 = [, ] ;
as const는 값을 넓히는 대신 가장 구체적인(리터럴), 깊이 readonly한 타입을 추론하도록 TypeScript에 지시하는 **const 단언(const assertion)**입니다.
a = ;
obj = { : };
arr = [, ];
b = ;
obj2 = { : } ;
arr2 = [, ] ;
세 가지를 합니다: 아무것도 넓히지 않고(리터럴 값을 유지), 모든 것을 readonly로 만들고, 배열을 tuple로 바꿉니다.
값 목록으로부터 union 타입 파생(단일 진실 공급원):
const ROLES = ["admin", "editor", "viewer"] as const;
type Role = typeof ROLES[number]; // "admin" | "editor" | "viewer"
// 배열에 역할 추가 → union이 자동으로 갱신됨
config/상태의 리터럴 타입 보존:
const action = { type: "INCREMENT", by: 1 } as const;
// action.type은 "INCREMENT" (리터럴)이므로 discriminated union에서 동작
// as const 없으면 `string`이 되어 narrowing이 깨짐
as const는 런타임 값과 정밀한 타입을 잇습니다.
데이터를 한 번 정의(배열/객체)하고 그로부터 정확한 리터럴 타입을 파생하게 해줍니다 — 액션 타입, 라우트 맵, config, 그리고 string으로 넓혀지지 않고 리터럴로 유지되어야 하는 모든 discriminated union 태그에 매우 유용합니다.