```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