```typescript const Color = { Red:'Red', Green: 'Blue', Blue: 'Green' } as const enum ColorEnum { Red = 'Red', Green = 'Green', Blue = 'Blue' } type ColorType = keyof typeof Color function color(c: ColorType){ // do something } function enumColor(c: ColorEnum){ // do something } color("Red") enumColor("Red") // 💣 error!! ``` [[as const]]와 enum의 사용 목적은 값의 범위를 좁혀서 제한된 값들만 입력하거나 출력하는 것에 있다. 예를 들어 위의 예제에서 `ColorType`, `ColorEnum`에 입력할 수 있는 값은 3개로 제한되어있다. 그런데 문법적 기능은 비슷하지만 미묘하게 다른 부분이 있는데, `enumColor` 의 경우 [[String literal type]]을 넣게 되면 에러가 발생하고 반드시 `ColorEnum.Red` 같은 값을 넘겨야 한다. --- 프로그래머마다 각자 선호하는 문법이 있지만 되도록 [[as const]]를 사용하는 이유를 든다면 다음의 예제에서 명확할 것이다. ```typescript enum Roles { Admin, Writer, Reader } declare function hasAccess(role: Roles): void; hasAccess(10); ``` ~~`hasAccess` 함수에 어떤 number 값을 넣어도 타입 에러가 발생하지 않기 때문에 이런 경우엔 잠재적인 버그를 갖게 된다. **EDIT: v5.0.4 부터는 위의 에러가 발생하지 않는다.** --- 참조 강의: https://inf.run/FVDi