숏컷 코드
enum Direction {
Up = "UP",
Down = "DOWN",
Left = "LEFT",
Right = "RIGHT",
}
function move(dir: Direction) {
console.log(dir);
}enum 형태
enum을 읽을 때 먼저 나눠 볼 기본형은 아래입니다.
- string enum
- numeric enum
const enumas const객체 + 타입 추출
1) 관련 상수 집합을 이름과 함께 묶으면 enum
enum은 값 집합에 의미 있는 이름을 붙이고, 그 집합 자체를 타입으로도 쓸 수 있게 합니다.
enum Direction {
Up = "UP",
Down = "DOWN",
}즉 흩어진 문자열 상수보다 더 구조화된 표현이 필요할 때 잘 맞습니다.
2) 실전에서는 string enum이 더 예측 가능한 경우가 많다
숫자 enum보다 string enum은 직렬화와 디버깅에서 더 읽기 쉽고, 의도하지 않은 숫자 접근 문제도 줄어듭니다.
enum Status {
Idle = "idle",
Loading = "loading",
}그래서 특별한 이유가 없으면 string enum 쪽이 더 무난한 경우가 많습니다.
enum HttpCode {
Ok = 200,
NotFound = 404,
}numeric enum도 가능하지만, 역방향 매핑과 숫자 의미 해석 때문에 string enum보다 읽기 비용이 커질 수 있습니다.
3) 타입만 필요하면 literal union이나 as const 객체가 더 가볍다
런타임 enum 객체가 굳이 필요 없고, 가능한 값 집합만 제한하면 된다면 literal union이 더 단순합니다.
type Status = "idle" | "loading" | "done";런타임 값 객체도 같이 쓰고 싶다면 as const 객체 + 타입 추출 조합도 자주 대안이 됩니다.
const Status = {
Idle: "idle",
Loading: "loading",
Done: "done",
} as const;
type Status = typeof Status[keyof typeof Status];4) const enum은 환경 제약까지 같이 봐야 한다
const enum은 컴파일 시 값이 인라인되어 런타임 객체가 남지 않습니다.
하지만 isolatedModules 기반 도구 체인에서는 충돌할 수 있어 환경을 같이 봐야 합니다.
또 preserveConstEnums를 켜면 런타임 enum이 유지되는 예외가 있으므로, 기본 동작과 예외 설정을 함께 구분해 두는 편이 정확합니다.
5) enum은 무조건 최신/최선의 선택지가 아니다
TypeScript에서는 enum, literal union, as const 객체가 모두 쓸 수 있으므로, "어떤 문제를 푸는가"에 따라 고르는 편이 더 정확합니다.
언제 enum을 쓸까
- 이름 붙은 상수 집합 + 런타임 객체가 필요하다: enum
- 직렬화와 가독성이 중요하다: string enum
- 타입만 필요하다: literal union
- 값 객체와 타입 추출을 같이 쓴다:
as const객체 const enum을 쓴다: 빌드 환경과isolatedModules확인
주의할 점
const enum은 isolatedModules: true 환경에서 충돌할 수 있습니다. Vite, esbuild, swc 계열 설정이라면 일반 enum이나 as const 객체가 더 안전한 경우가 많습니다.
// 대안: 런타임 객체 + 타입 추출
const Status = { Idle: "idle", Done: "done" } as const;
type Status = typeof Status[keyof typeof Status];참고 링크
1 sources