숫자 열거형 (Numeric enums)
enum Direction {
Up = 1,
Down, // 2
Left, // 3
Right, // 4
}
문자열 열거형 (String enums)
문자열 열거형은 숫자형처럼 자동 증가하는 기능은 없지만, 지정된 이름과 무관하게 유의미한 좋은 값으로 커스텀 후 실행할 수 있다.
enum Direction {
Up = "UP",
Down = "DOWN",
Left = "LEFT",
Right = "RIGHT",
}
이종 열거형 (Heterogeneous enums)
기술적으로 아래처럼 숫자와 문자를 섞어서 사용할 수 있지만, 이렇게 사용하지 않는 것을 권장한다.
enum BooleanLikeHeterogeneousEnum {
No = 0,
Yes = "YES"
}
계산된 멤버와 상수 멤버 (Computed and constant members)
열거형의 첫 번째 데이터이며 초기화 값이 없는 경우, 0으로 값이 할당되며 상수로 간주한다.
enum E { X } // 0
숫자 상수로 초기화된 멤버 뒤에 나오는 멤버들은 앞에 나온 멤버에 1씩 증가한 값을 상수로 갖는다.
enum E { X, Y, Z } // 0, 1, 2
열거형 멤버들은 상수 열거형 표현식으로 초기회되며, 아래의 경우 상수 열거형 표현식이라 한다.
- 리터럴 열거형 표현식 (기본적으로 문자 리터럴 또는 숫자 리터럴)
- 이전에 정의된 다른 상수 열거형 멤버에 대한 참조 (다른 열거형에서 시작될 수 있음)
-
- 괄호로 묶인 상수 열거형 표현식
-
- 상수 열거형 표현식에 단항 연산자
+
,-
,~
를 사용한 경우
- 상수 열거형 표현식에 단항 연산자
-
- 상수 열거형 표현식을 이중 연산자
+
,-
,*
,/
,%
,<<
,>>
,>>>
,&
,|
,^
의 피연산자로 사용할 경우
- 상수 열거형 표현식을 이중 연산자
이외 다른 모든 경우 열거형 멤버는 계산된 것으로 간주한다.
enum FileAccess {
None, // 상수
Read = 1 << 1, // 상수
Write = 1 << 2, // 상수
ReadWrite = Read | Write, // 상수
G = "123".length // 계산
}
유니언 열거형과 열거형 멤버 타입 (Union enums and enum member types)
열거형 타입의 멤버는 그 멤버 자체로도 타입이 될 수 있다.
enum ShapeKind {
Circle,
Square,
}
interface Circle {
kind: ShapeKind.Circle;
radius: number;
}
interface Square {
kind: ShapeKind.Square;
sideLength: number;
}
let c: Circle = {
kind: ShapeKind.Square, // X 여기에는 ShapeKind.Circle, 즉 0만 들어갈 수 있다.
radius: 100,
}
런타임에서의 열거형 (Enums at runtime)
열거형은 런타임에 존재하는 객체이며, 아래와 같이 실제로 함수로 전달될 수도 있다.
enum E { X, Y, Z };
const f = (obj: { X: number }) => obj.X;
f(E);
컴파일 시점에서의 열거형 (Enums at compile time)
열거형이 런타임에 실제로 존재하는 객체라고 할지라도, keyof
키워드는 일반적인 객체에서 기대하는 동작과 다르게 동작한다. 대신, keyof
, typeof
를 사용하면 모든 열거형의 키를 문자열로 나타내는 타입을 가져온다.
enum LogLevel { ERROR, WARN, INFO, DEBUG };
type LogLevelStrings = keyof typeof LogLevel;
const printImportant = (key: LogLevelStrings, message: string) => {
const num = LogLevel[key];
if (num <= LogLevel.WARN) {
console.log('key: ', key);
console.log('value: ', num);
console.log('message: ', message);
}
}
printImportant('ERROR', 'This is a message');
역매핑 (Reverse mappings)
숫자 열거형 멤버는 프로퍼티 이름을 가진 객체를 생성하는 것 이외에도 열거형 값에서 그 이름으로 역매핑을 받는다.
enum Enum { A };
let a = Enum.A;
let nameOfA = Enum[a]; // "A"
참고로, 문자열 열거형은 역매핑을 생성하지 않는다.
const 열거형 (const enums)
const 열거형은 const
지정자를 열거형에 붙여 정의하며, 상수 열거형 표현식에만 사용된다. enum
보다 엄격하게 적용할 때 사용된다.,
const enum Enum { A = 1, B = A * 2 };
일반적인 열거형과 달리, 컴파일 과정에서 완전히 제거된다. 사용하는 공간에 인라인되며, 이러한 동작은 계산된 멤버를 가지고 있지 않기 때문에 가능하다.
const enum Directions { Up, Down, Left, Right }
let directions = [Directions.Up, Directions.Down, Directions.Left, Directions.Right]
위 코드는 아래와 같이 컴파일되며, 어떠한 코드도 남지 않는다.
var directions = [0 /* Up */, 1 /* Down */, 2 /* Left */, 3 /* Right */];
Ambient 열거형 (Ambient enums)
Ambient
열거형은 이미 존재하는 열거형 타입의 모습을 묘사하기 위해 사용된다.
declare enum Enum { A = 1, B, C = 2 } // B는 계산된 멤버로 간주
ambient
열거형을 사용할 때의 가장 큰 차이점은, const
가 아닌 ambient
열거형에서 초기화되지 않은 멤버는 항상 계산된 멤버로 간주된다.
'스터디' 카테고리의 다른 글
[Typescript] 유틸리티 타입 (1) | 2023.06.19 |
---|---|
[Typescript] 제네릭 (Generics) (0) | 2023.06.12 |
[Typescript] 유니언 타입과 교차 타입 (0) | 2023.06.11 |
[Typescript] 리터럴 타입 (0) | 2023.06.10 |
[Typescript] 함수 (0) | 2023.06.10 |