Typescript Enum

enum을 사용하면 명명된 상수 집합을 정의할 수 있습니다.

1
2
3
4
5
6
enum Direction {
Up = 1,
Down,
Left,
Right
}

enum의 바디는 0개 이상의 enum 멤버로 구성됩니다. enum 멤버는 관련 숫자 값을 가지며 상수이거나 계산 될 수 있습니다. enum 멤버는 다음과 같은 경우 상수로 간주됩니다.

  • 초기 설정 값이 없고 앞의 enum 멤버가 상수입니다. 이 경우 현재 enum 멤버의 값은 이전 enum 멤버의 값에 1을 더한 값이됩니다. 이 규칙의 한 가지 예외는 열거 형의 첫 번째 멤버입니다. 초기 설정값이 없으면 값 0이 지정됩니다.
  • enum 멤버는 상수 enum 식으로 초기화됩니다. 상수 enum 식은 컴파일 타임에 완전히 평가할 수있는 TypeScript 식의 하위 집합입니다. 표현식은 다음 중 하나 인 경우 상수 enum 식입니다.
  • 숫자 리터럴
  • 이전에 정의된 상수 enum 형 멤버 (다른 enum 형에서 정의 할 수 있음)에 대한 참조. member가 동일한 enum 형에 정의 된 경우 enum 명칭이 없는 이름을 사용하여 참조 할 수 있습니다.
  • 괄호로 묶인 상수 enum 표현식
  • 단항 연산자 +, -, ~ 가 적용된 상수 enum 표현식
  • 상수 enum식이 피연산자로 사용되는 이진 연산자 constant enum식. 상수 enum 식이 NaN 또는 Infinity로 평가되면 컴파일 타임 오류가 발생합니다.

다른 모든 경우에 enum 멤버는 계산 된 것으로 간주됩니다.

1
2
3
4
5
6
7
8
9
enum FileAccess {
// constant members
None,
Read = 1 << 1,
Write = 1 << 2,
ReadWrite = Read | Write,
// computed member
G = "123".length
}

enum은 런타임에 존재하는 실제 객체입니다. 한 가지 근거는 enum 값에서 enum 이름으로 역 매핑을 유지하는 기능입니다.

1
2
3
4
5
enum Enum {
A
}
let a = Enum.A;
let nameOfA = Enum[Enum.A]; // "A"

1
2
3
4
5
6
var Enum;
(function (Enum) {
Enum[Enum["A"] = 0] = "A";
})(Enum || (Enum = {}));
var a = Enum.A;
var nameOfA = Enum[Enum.A]; // "A"

으로 컴파일 됩니다.

생성 된 코드에서 enum은 forward (name -> value) 매핑과 reverse (value -> name) 매핑을 모두 저장하는 객체로 컴파일됩니다. enum 멤버에 대한 참조는 항상 속성 액세스로 내보내지며 결코 인라인되지 않습니다. 많은 경우에 이것은 완벽하게 유효한 해결책입니다. 그러나 때로는 요구 사항이 더 엄격합니다. enum 값에 액세스 할 때 여분의 생성 된 코드 및 추가 indirection의 비용을 지불하지 않으려면 const 열거 형을 사용할 수 있습니다. const 열거 형은 enum 키워드 앞에 오는 const 한정자를 사용하여 정의됩니다.

1
2
3
4
const enum Enum {
A = 1,
B = A * 2
}

const enum은 상수 enum 표현식만 사용할 수 있으며 일반 enum과 달리 컴파일하는 동안 완전히 제거됩니다. const enum 멤버는 인라인됩니다. 이것은 const enum가 계산 된 멤버를 가질 수 없기 때문에 가능합니다.

1
2
3
4
5
6
7
8
const enum Directions {
Up,
Down,
Left,
Right
}
let directions = [Directions.Up, Directions.Down, Directions.Left, Directions.Right]

1
var directions = [0 /* Up */, 1 /* Down */, 2 /* Left */, 3 /* Right */];

로 컴파일 됩니다.

Share