문서의 이전 판입니다!
tsc는
enum Zoo { Cat, Tiger }
위의 코드를
var Zoo; (function (Zoo){ Zoo[Zoo["Cat"] = 0] = "Cat"; Zoo[Zoo["Tiger"] = 1] = "Tiger"; )(Zoo || (Zoo{}))
로 변경한다.
enum을 사용하면 이름이 부여된 상수 집합을 정의할 수 있다.
enum Direction { Up=1, Down, Left, Right } // Direction.Up은 값 1, Down은 2, Left는 3, Rright는 4를 가진다. // 1로 초기화되고, 모든 후속멤버는 자동증가한다.
enum E { A = getSomeValue(), B, // error! 'A' is not constant-initialized, so 'B' needs an initializer }
enum Direction { Up = "UP", Down = "DOWN", Left = "LEFT", Right = "RIGHT", }
이론적으로는 가능하지만 어떤 필요성이 있는지는 의문
enum BooleanLikeHeterogenousEnum { No = 0, Yes = "YES", }
각 enum 멤버는 상수 또는 계산됨 중 하나의 값을 가진다.
멤버가 상수로 간주되는 경우
constant enum expression은 compile time에 모두 계산 가능한 TypeScript 수식의 부분집합이다.
constant enum expression이 NaN 또는 Infinity로 평가되는 것은 컴파일 타임 오류입니다.
다른 경우의 모든 enum 멤버는 computed로 간주됩니다.
enum FileAccess { // constant members None, Read = 1 << 1, Write = 1 << 2, ReadWrite = Read | Write, // computed member G = "123".length }
Enums는 런타임에 존재하는 실제 객체이다.
enum E { X, Y, Z } function f(obj: { X: number }) { return obj.X; } // Works, since 'E' has a property named 'X' which is a number. f(E); // enum은 함수에 매개변수로 전달될 수 있다.
Enums은 런타임에 존재하는 실제 객체이지만 keyof 키워드는 일반적인 객체에서 기대하는 것과 다르게 작동합니다. 대신 keyof typeof를 사용하여 모든 Enum 키를 문자열로 나타내는 Type을 가져옵니다.
enum LogLevel { ERROR, WARN, INFO, DEBUG } /** * This is equivalent to: * type LogLevelStrings = 'ERROR' | 'WARN' | 'INFO' | 'DEBUG'; */ type LogLevelStrings = keyof typeof LogLevel; function printImportant(key: LogLevelStrings, message: string) { const num = LogLevel[key]; if (num <= LogLevel.WARN) { console.log('Log level key is: ', key); console.log('Log level value is: ', num); console.log('Log level message is: ', message); } } printImportant('ERROR', 'This is a message');
numeric enums 멤버는 구성원에 대한 속성 이름이있는 개체를 만드는 것 외에도 enum 값에서 enum 이름으로 역매핑을 가져옵니다.
enum Enum { A } let a = Enum.A; let nameOfA = Enum[a]; // "A"
string enums 멤버는 역 매핑을 전혀 생성하지 않는다는 것을 명심하라
대부분의 경우 열거 형은 완벽하게 유효한 솔루션입니다. 그러나 때로는 요구 사항이 더 엄격합니다. enum 값에 액세스 할 때 여분의 생성 된 코드 및 추가 indirection의 비용을 지불하지 않으려면 const 열거 형을 사용할 수 있습니다. Const enum은 enum의 const 수정자를 사용하여 정의됩니다.
const enum Enum { A = 1, B = A * 2 }
Const enum은 상수 enum 표현식 만 사용할 수 있으며 일반 enum과 달리 컴파일하는 동안 완전히 제거됩니다. Const enum 멤버는 사용되는 곳에 인라인됩니다. const 열거 형은 computed 멤버를 가질 수 없기 때문에 가능합니다.
let directions = [Directions.Up, Directions.Down, Directions.Left, Directions.Right] // 이것은 다음과 같은 코드로 생성된다. var directions = [0 /* Up */, 1 /* Down */, 2 /* Left */, 3 /* Right */];
앰비언트 열거 형은 이미 존재하는 열거 형의 모양을 설명하는 데 사용됩니다.
declare enum Enum { A = 1, B, C = 2 }
ambient 과 non-ambient enums의 중요한 차이점 중 하나는 일반 enum에서는 초기화가 없는 멤버는 이전 enum 멤버가 constant로 간주되는 경우 constant로 간주된다는 것입니다. 대조적으로, 초기화가 없는 ambient(및 non-const) enum 멤버는 항상 **computed“로 간주됩니다.