문서의 이전 판입니다!
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
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의 중요한 차이점 중 하나는 일반 열거 형에서 이니셜 라이저가없는 멤버는 이전 열거 형 멤버가 상수로 간주되는 경우 상수로 간주된다는 것입니다. 대조적으로, 이니셜 라이저가없는 앰비언트 (및 비 const) 열거 형 멤버는 항상 계산 된 것으로 간주됩니다.