Typescript 문서 - 07

Typescript 문서 - 07

Enums

Enums을 사용하면 상수를 정의할 수 있다.

Numeric enums

enum Direction {
  Up = 1,
  Down,
  Left,
  Right
}
// Up: 1, Down: 2, Left: 3, Right: 4
enum의 첫 번째 요소가 초기화하지 않았다면 값은 0이 지정된다.
// enum 사용법
enum Response {
  No = 0,
  Yes = 1,
}

function respond(recipient: string, message: Response): void {
  // ...
}

respond("Princess Caroline", Reaponse.Yes);
숫자 열거형은 1) 계산된 상수 2) 숫자 상수 혼합 가능하다. 아래와 같은 경우는 사용하지 못한다.
enum E {
  A = getSomeValue(),
  B, // Error!(A는 상수로 초기화되지 않으므로, B도 초기화해주어야 한다.)
}

String enums

문자열 리터럴 또는 문자열 열거형 멤버로 초기화되어야 한다.
enum Direction {
  Up = "UP",
  Down = "DOWN",
  Left = "LEFT",
  Right = "RIGHT"
}
문자열 enum은 숫자처럼 자동 증가할 수 없지만, 각각의 멤버에 초기화해주는 것이 좋다.

Heterogeneous enums

아래의 방법으로 하지 않는 것이 좋다.
enum BooleanLikeHeterogeneousEnum {
  No = 0,
  Yes = "YES",
}

Computed and constant members

열거형 멤버는 다음과 같은 경우 상수로 간주한다.
  1. 열거형의 첫 번째 멤버이며 초기화하지 않은 경우에는 0이 할당된다.
    enum E { X }
    
  2. 아래와 같은 경우 상수 열거식이다.
  1. 리터럴 enum 표현식 (문자열 리터럴 또는 숫자 리터럴)
  2. 이전에 정의된 상수 열거형 멤버에 대한 참조
  3. 괄호 안의 상수 enum 표현식
  4. 상수 열거 표현식에 적용된 +, -, ~ 단항 연산자 중 하나
  5. 피연산자로 상수 enum 표현식이 있는 이진 연산자 +, -, *, /, %, <<, >>, >>>, &, |, ^
상수 enum식이 NaN 또는 Infinity는 컴파일 타임 오류이다.
enum FileAccess {
  // constant members
  None,
  Read    = 1 << 1,
  Write   = 1 << 2,
  ReadWrite  = Read | Write,
  // computed member
  G = "123".length
}

Enums at runtime

열거형은 런타임에 존재하는 실제 객체이다.

Reverse mappings

열거형 값에서 열거형 이름으로 역 매핑을 할 수 있다.
enum Enum {
  A
}
let a = Enum.A;
let nameOfA = Enum[a]; // "A"
TypeScript는 JavaScript와 같은 걸로 컴파일한다.
var Enum;
(function (Enum) {
  Enum[Enum["A"] = 0] = "A";
})(Enum || (Enum = {}));
var a = Enum.A;
var nameOfA = Enum[a]; // "A"

const enums

const enum은 상수 enum 표현식만 사용할 수 있으며, 일반 enum과 달리 컴파일하는 동안 완전히 제거된다.
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 enums

이미 존재하는 enum 타입의 형태를 설명하는 데 사용된다.
declare enum Enum { 
  A = 1,
  B,
  C = 2
}
Ambient와 Non-ambient enum의 차이점 중 하나는 일반적인 enum에서 초기화 코드가 없는 멤버는 상수 멤버로 인식한다는 것이다. 또한 초기화 코드가 없는 enum 멤버는 항상 계산된 것으로 간주한다.
enum의 종류와 내용이 이렇게 많을 줄이야…

댓글

가장 많이 본 글