Enum (열거형)
Enum은 여러 상수를 하나의 이름 아래 그룹화할 수 있는 TypeScript 전용 기능이다.
여러 값에 각각 이름을 부여해, 정해진 값의 집합처럼 사용할 수 있다.
JavaScript에는 enum 문법이 없지만, TypeScript에서는 컴파일 과정에서 JavaScript 코드로 변환된다.
1. 기본 문법
기본적으로 숫자형 Enum은 첫 번째 값이 0부터 시작해 순차적으로 증가한다.
ts
enum 이름 {
상수1, // 0
상수2, // 1
상수3, // 2
}Enum의 값은 꼭 0부터 시작할 필요가 없고, 임의의 숫자나 문자열로 시작할 수 있다.
ts
enum Status {
Success = 200,
NotFound = 404,
ServerError = 500,
}2. 숫자형
값을 지정하지 않으면 자동으로 0부터 시작한다.
ts
enum PlayerState {
Buffering,
Playing,
Paused,
Seeking,
}
let currentState: PlayerState = PlayerState.Playing;
currentState = 'Playing'; // Errorts
// 메서드 생성
const isPlaying = (state: PlayerState) => {
return state === PlayerState.Playing;
};
isPlaying(currentState); // true역방향 매핑 (Reverse Mapping)
숫자형 Enum은 값으로 이름을 찾는 것도 가능하다. 문자열 Enum에는 없는 특징이다.
ts
enum PlayerState {
Buffering,
Playing,
Paused,
}
console.log(PlayerState.Playing); // 1
console.log(PlayerState[1]); // "Playing"3. 문자열형
문자열 enum은 모든 값을 직접 초기화해야 한다.
ts
enum Direction {
Up = 'UP',
Down = 'DOWN',
Left = 'LEFT',
Right = 'RIGHT',
}
let direction: Direction = Direction.Up;
console.log(direction); // UP- 문자열 Enum은 디버깅 시 값이 그대로 보이기 때문에 더 직관적이다.
예시: switch 문
Enum은 조건문에서 특히 가독성이 좋다.
ts
enum Direction {
Up,
Down,
Left,
Right,
}
function move(direction: Direction) {
switch (direction) {
case Direction.Up:
console.log('Moving up!');
break;
case Direction.Down:
console.log('Moving down!');
break;
case Direction.Left:
console.log('Moving left!');
break;
case Direction.Right:
console.log('Moving right!');
break;
}
}
move(Direction.Up); // Moving up!4. const enum (최적화 용도)
const enum은 컴파일 시점에 값으로 치환된다.
ts
const enum Direction {
Up,
Down,
}
let d = Direction.Up;
// JavaScript로 컴파일되면 대략 아래처럼 변환된다.
// let d = 0;다만 const enum은 Babel, SWC, isolatedModules 같은 환경에서 제약이 있을 수 있어 프로젝트 설정에 따라 사용에 주의가 필요하다.
5. Enum vs Union Type
Enum도 사용할 수 있지만, 단순한 문자열 값의 집합은 union literal type으로 표현하기도 한다.
ts
// Enum
enum DirectionEnum {
Up = 'UP',
Down = 'DOWN',
}
// Union Literal Type
type DirectionUnion = 'UP' | 'DOWN';정리
👩🏻💻 요약
Enum은 상수 집합을 그룹화할 수 있는 타입스크립트 전용 기능숫자형Enum → 자동 증가, 역방향 매핑 가능문자열Enum → 값 직접 지정, 직관적const enum→ 성능 최적화, 하지만 요즘은 덜 쓰임