-
[TypeScript] 열거형TypeScript 2022. 9. 16. 20:54728x90
TypeScript는 숫자와 문자열을 기반으로 한 열거형을 제공합니다.
숫자 열거형 (Numeric enums)
열거형은 enum 키워드를 사용해 정의할 수 있습니다.
enum Direction1 { Up = 1, Down, Left, Right, } enum Direction2 { Up, Down, Left, Right, } enum Direction3 { Up, // 0 Down, // 1 Left=3, // 3 Right, // 4 } enum E { Z, // 0 A = getSomeValue(), B, // 오류! 앞에 나온 A가 계산된 멤버이므로 초기화가 필요합니다. } //열거형에 접근하는 방법 console.log(Direction3.Right)
Up을 1로 초기화한다면 Down = 2, Left = 3, Right = 4가 되고
Up을 초기화하지 않는다면 Up = 0, Down = 1, … 이 됩니다.
이렇게 자동으로 증가하는 기능은 멤버 값 자체에는 신경 쓰지 않지만, 각 값이 같은 열거형의 다른 값과 구별돼야 하는 경우에 매우 유용합니다
그리고 열거형에는 숫자 상수가 아닌 값이 할당되면 그 다음 값은 초기화돼야 합니다.
문자열 열거형(String enums)
숫자형과 유사하지만 런타임에서 동작이 살짝 다릅니다. 문자열 열겨형의 각 멤버는 문자열 리터럴 또는 다른 문자열 열거형의 멤버로 초기화해야 합니다.
enum Direction { Up = "UP", Down = "DOWN", Left = "LEFT", Right = "RIGHT", }
자동 증가 기능은 없지만 직렬화를 잘 한다는 이점이 있습니다.
숫자는 어떤 의미인지 직관적으로 알기 힘들지만, 문자는 직관적으로 알 수 있습니다. 그리고 숫자는 값이 불확실한 경우가 종종 발생할 수 있습니다.
이종 열거형(Heterogeneous enums)
숫자와 문자를 섞어서도 사용할 수 있지만 이렇게 사용하 것을 권장하지 않습니다.
enum BooleanLikeHeterogeneousEnum { No = 0, Yes = "YES", }
계산된 멤버와 상수 멤버(Computed and constant members)
// E.X는 상수입니다: enum E { X } // 0 // 'E1' 과 'E2' 의 모든 열거형 멤버는 상수입니다. enum E1 { X, Y, Z } // 0, 1, 2 enum E2 { A = 1, B, C // 1, 2, 3 }
- 열거형 멤버는 열거형 표현식으로 초기화됩니다.
- 리터럴 열거형 표시(문자 or 숫자)
- 이전에 정의된 다른 상수 열거형 멤버에 대한 참조
- 괄호로 묶인 상수 열거형 표현식
- 상수 열거형 표현식에 단항 연산자 +, -. ~를 사용한 경우
- 상수 열거형 표현식을 이중 연산자 +, -, *, /, %, <<, >>, >>>, &, |, ^의 피연산자로 사용할 경우
- 상수 열거형 표현식의 값이 NaN 또는 Infinity 면 컴파일 오류가 발생
enum FileAccess { // 상수 멤버 None, // 0 Read = 1 << 1, // 2 Write = 1 << 2, // 4 ReadWrite = Read | Write, // 6 // 계산된 멤버 G = "123".length // 3 }
유니언 열거형과 열거형 멤버 타임(Union enums and enum member types)
런타임에서 열거형
열거형은 런타임에 존재하는 실제 객체입니다. 따라서 아래와 같이 함수로 전달될 수 있습니다.
enum E { X, Y, Z } function f(obj: { X: number }) { return obj.X; } // E가 X라는 숫자 프로퍼티를 가지고 있기 때문에 동작하는 코드입니다. f(E);
컴파일 시점에서 열거형(Enums at compile time)
열거형이 런타임에 존재하는 실제 객체지만, keyof 키워드는 일반적인 객체에서 기대하는 동작과 다르게 동작합니다. 대신, keyof typeof 를 사용하면 모든 열거형의 키를 문자열로 나타내는 타입을 가져옵니다.
enum LogLevel { ERROR, WARN, INFO, DEBUG } /** * 이것은 아래와 동일합니다. : * 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'); // Error This is a message 0
역 매핑(Reverse mapping)
숫자 열거형 멤버는 멤버의 프로퍼티 이름을 가진 객체를 생성하는 것 외에도 열거형 값에서 열거형 이름으로 역 매핑 을 받습니다.
enum Enum { A } let a = Enum.A; let nameOfA = Enum[a]; // "A"
문자열 열거형은 역 매핑을 생성하지 않는다 는 것을 명심하시길 바랍니다.
const 열거형
const 열거형은 상수 열거형 표현식만 사용될 수 있으며 일반적인 열거형과 달리 컴파일 과정에서 완전히 제거 됩니다.
const enum Directions { Up, Down, Left, Right } let directions = [Directions.Up, Directions.Down, Directions.Left, Directions.Right] // 0, 1, 2, 3
Ambient 열거형(Ambient enums)
이미 존재하는 열거형 타입의 모습을 묘사하기 이ㅜ해 사용됩니다.
declare enum Enum { A = 1, B, C = 2 }
참고
https://typescript-kr.github.io/pages/enums.html#런타임에서-열거형-enums-at-runtime
728x90'TypeScript' 카테고리의 다른 글
[TypeScript] 고급타입-1 (0) 2022.09.21 [TypeScript] 제네릭 (0) 2022.09.17 [TypeScript] 클래스 (0) 2022.09.15 [TypeScript] 유니언과 교차타입 (1) 2022.09.10 [TypeScript] 인터페이스 (0) 2022.09.08 - 열거형 멤버는 열거형 표현식으로 초기화됩니다.