Enum Type
은 Javascript와 Typescript와의 여러가지 차이점 중 한가지이다.
다양한 시스템 언어들이 Enum을 사용하고 있기 때문에 굳이 자세히 설명하지 않아도 될 것 같다.
Enum
Enum 타입을 사용하는 이유는 다양하다.
-
가독성을 높힌다.
공통된 특징을 지닌 변수를 한 곳에 묶어서 사용할 수 있기 때문에 가독성이 높아진다.
-
엄격한 타입정의가 가능하다.
Typescript를 사용하는 이유중 한가지인 엄격한 형관리를 좀 더 타이트하게 할 수 있다.
-
자칫 발생할 수 있는 값 변경을 방지할 수 있다.
2번에서 이어지는 형관리를 통해 자칫 발생할 수 있는 값 변경을 방지할 수 있다. (Enum에 정의되지 않는 데이터)
Enum의 사용
간단하게 Typescript에서 Enum
을 사용해 보자면
enum COUNT1 {
ZERO,
FIRST,
SECOND
}
console.log(COUNT1.ZERO) // 0
enum COUNT2 {
FIRST = 1,
SECOND,
THIRD
}
console.log(COUNT2.SECOND) // 2
enum COUNT3 {
FIRST = 1,
SECOND = 4,
THIRD
}
console.log(COUNT3.THIRD) // 5
사용법부터 특징까지 기존언어들과 매우 동일하다.
별다른 값을 명시하지 않는다면 첫 데이터 순서대로 0, 1, 2...
값을 갖는다.
초기 값을 숫자로 정의하면 나머지 데이터는 +1
만큼 연산된 숫자를 차례로 갖는다.
만약 숫자가 아닐 경우엔 정확히 데이터를 할당해 주어야한다.
enum ALPHABET {
A = 'a',
B, // TS1061: Enum member must have initializer.
C // TS1061: Enum member must have initializer.
}
Enum == Object??
Typescript에서 Enum의 가장 큰 특이점은 바로 Object라는 점이다.
enum STATUS {
SUCCESS = 's',
FAIL = 'f',
PENDING = 'p',
PROGRESS = 'g'
}
console.log(STATUS) // { SUCCESS: 's', FAIL: 'f', PENDING: 'p', PROGRESS: 'g' }
이것이 가능한 이유는 tsc를 이용해 컴파일해보면 쉽게 알 수 있다.
var STATUS;
(function (STATUS) {
STATUS["SUCCESS"] = "s";
STATUS["FAIL"] = "f";
STATUS["PENDING"] = "p";
STATUS["PROGRESS"] = "g";
})(STATUS || (STATUS = {}));
위와 같이 Object에 각 key값을 할당해주는 방식으로 컴파일된다.
결국 Object라고 볼 수 있다.
이를 알고 활용하면 Object내장함수
를 이용하여 여러가지 응용이 가능하다.
enum STATUS {
SUCCESS = 's',
FAIL = 'f',
PENDING = 'p',
PROGRESS = 'g'
}
console.log(Object.keys(STATUS)) // [ 'SUCCESS', 'FAIL', 'PENDING', 'PROGRESS' ]
console.log(Object.values(STATUS)) // [ 's', 'f', 'p', 'g' ]