본문 바로가기
스터디

[Typescript] 열거형 (Enums)

by rious275 2023. 6. 11.

숫자 열거형 (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

열거형 멤버들은 상수 열거형 표현식으로 초기회되며, 아래의 경우 상수 열거형 표현식이라 한다.

  • 리터럴 열거형 표현식 (기본적으로 문자 리터럴 또는 숫자 리터럴)
  • 이전에 정의된 다른 상수 열거형 멤버에 대한 참조 (다른 열거형에서 시작될 수 있음)
    1. 괄호로 묶인 상수 열거형 표현식
    1. 상수 열거형 표현식에 단항 연산자 +, -, ~ 를 사용한 경우
    1. 상수 열거형 표현식을 이중 연산자 +, -, *, /, %, <<, >>, >>>, &, |, ^ 의 피연산자로 사용할 경우

이외 다른 모든 경우 열거형 멤버는 계산된 것으로 간주한다.

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