enum
키워드를 이용한다.enum Color {
RED,
GREEN,
BLUE
}
function setColor(color: Color) {
// ...
}
setColor(Color.RED);
enum Direction {
Up, // 0
Down, // 1
Left,
Right,
}
enum Color {
RED = 10,
GREEN = 20,
BLUE = RED + GREEN // 런타임이 아닌 컴파일 타임에 30이라는 값이 할당된다.
}
enum Color {
RED = "red",
GREEN = "green",
}
console.log(Color[Color.RED]); //undefined
초기화 용도의 표현식은 런타임이 아닌 컴파일 타임에 평가된다는 특징이 있다. 물론 enum 내부에서 알 수 없는 외부 변수를 사용하는 경우에는 표현식이 유지되었다가 추후 할당된다.
숫자 열거형은 계산된 멤버와 상수 멤버를 혼용해 사용할 수 있다.
계산된 멤버와 상수 멤버
연산자가 포함된 모든 표현식이 계산된 멤버는 아니다.
아래의 경우 상수 열거형 표현식이라고 하며 그 외 다른 경우를 계산된 멤버로 간주한다.
+
, -
, ~
를 사용한 경우+
, -
, *
, /
, %
, >>
, <<
, >>>
, &
, |
, ^
의 피연산자로 사용한 경우이 때 허용 가능한 순서에 유의해야 한다.
초기화되지 않은 열거형이 먼저 나오거나, 숫자 상수 혹은 다른 상수 열거형 멤버와 함께 초기화된 숫자 열거형 이후에 와야한다.
case 1 : 계산된 멤버가 초기화되지 않은 열거형 앞에 올 수 없다.
case 2 : 초기화 값이 없거나 숫자 상수로 초기화된 열거형 멤버 뒤에 오는 경우 앞 상수 값에 1씩 증가한 값을 상수로 갖는다.
//case 1
enum E {
A = getSomeValue(),
B, // 오류! 앞에 나온 A가 계산된 멤버이므로 초기화가 필요합니다.
}
//case 2
enum E1 {
X, // 0
Y, // 1
Z
}
enum E2 {
A = 1,
B, // 2
C
}
enum BooleanLikeHeterogeneousEnum {
No = 0,
Yes = "YES",
}
// ts로 작성된 enum
enum Color {
RED,
GREEN,
BLUE
}
// 트랜스 파일 후
var Color;
(function (Color) {
Color[Color["RED"] = 0] = "RED";
Color[Color["GREEN"] = 1] = "GREEN";
Color[Color["BLUE"] = 2] = "BLUE";
})(Color || (Color = {}));
// 위 즉시실행 함수는 결과적으로 아래와 같은 객체가 된다.
var Color = {
RED: 0,
GREEN: 1,
BLUE: 2,
0: "RED",
1: "GREEN",
2: "BLUE"
};
const
와 함께 사용할 수 있다. 이 경우 트랜스파일 결과물을 가지지 않는다. (= 트랜스파일 결과 생성되던 객체가 없다.)ERROR: [ts] In 'const' enum declarations member initializer must be constant expression.
추가 자료
enum을 사용하지 않는 게 좋은 이유 - Tree-shaking관점
참고 자료
https://hyunseob.github.io/2017/07/18/typescript-enums/