"as const는 ‘이 값은 앞으로도 지금 적은 바로 그 값이다’라고 컴파일러에 말해."
세 가지 변화가 함께 일어나
리터럴 뒤에 as const를 붙이면 원시값이 넓은 타입으로 퍼지지 않고 정확한 리터럴 타입으로 남아. 객체 속성은 읽기 전용이 되고, 배열은 각 위치와 길이를 기억하는 읽기 전용 튜플이 된다.
['red', 'blue']는 보통 string 배열이지만 ['red', 'blue'] as const는 readonly ['red', 'blue']야. 단순히 배열을 얼리는 기능이 아니라 정확성, 읽기 전용, 튜플 추론을 한꺼번에 요청하는 문법이지.
고정 목록에서 유니언을 뽑아
const ROLES = ['admin', 'editor', 'viewer'] as const를 선언한 뒤 type Role = typeof ROLES[number]라고 쓰면 세 문자열의 리터럴 유니언을 얻어. 실행 중 순회할 목록과 컴파일 시점 타입을 한 선언에서 파생하므로 둘이 어긋나지 않아.
설정 키, 지원 언어, 명령 이름처럼 실행에도 필요하고 타입에도 필요한 닫힌 목록에 이 패턴이 잘 맞아. 별도 enum과 배열을 각각 관리하는 중복을 없애지.
객체 설정과 판별 필드
설정 객체에 붙이면 각 속성의 값이 리터럴로 남아. 판별 가능한 유니언을 만들거나 경로 상수에서 실제 허용 경로 타입을 뽑을 때 유용해. 다만 객체 전체가 깊게 읽기 전용처럼 추론되므로 나중에 값을 바꿀 계획이라면 맞지 않아.
satisfies와의 차이
as const는 값을 최대한 좁고 읽기 전용으로 만든다. satisfies는 특정 계약을 만족하는지 검사하면서 원래 추론 정보를 보존해. 설정이 계약을 확인해야 하지만 모든 속성을 읽기 전용으로 만들고 싶지 않다면 satisfies가 더 알맞을 수 있어. 둘을 함께 쓰는 경우도 있다.
as const와 typeof X[number]를 써. 한 선언이 두 세계를 잇게 해.