[TS] 열거형 (Enums)

ClassBinu·2024년 3월 27일

열거형

열거형: 이름 있는 상수들의 집합 정의
TS는 숫자, 문자열 기반 열거형 제공

숫자 열거형

enum Direction {
  Up = 1,
  Dwon, // 2
  Left, // 3
  Right, // 4
}

초기화된 숫자를 지정하지 않으면 자동으로 0부터 부여

열거형 사용 예시

enum Response {
    No = 0,
    Yes = 1,
}

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

respond("Princess Caroline", Response.Yes)

열거형 종류

열거형은 상수 멤버와 계산된 멤버 두 가지가 있다.

Constant member

컴파일 시 값이 결정
숫자 리터럴 또는 이전에 정의된 상수 열거형 멤버의 참조를 통해 초기화

Computed member

실행 시에 그 값이 결정
함수 호출 결과나 계산된 표현식 포함

tsfunction getSomeValue(): number {
    return 5;
}

enum E {
    A = getSomeValue(), // 계산된 멤버
    B, // 오류! A가 계산된 멤버이므로 B의 값을 자동으로 결정할 수 없습니다.
}

E.B는 자동으로 값을 할당받는데 A 값이 정해지지 않았기 때문에 오류가 발생
이 경우 계산된 멤버는 뒤로 가야 함.

런타임에서 열거형

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

역 매핑

열거형 멤버의 값으로 이름을 얻을 수 있는 기능(숫자 열거형에서만 가능)

enum Enum {
    A
}
let a = Enum.A;
let nameOfA = Enum[a]; // "A"

단, 숫자형만 역 매핑을 생성하고 문자열 열거형은 역 매핑을 생성하지 않음.

const 열거형

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]

const 열거형 장점

  • JS 파일 크기 줄일 수 있음.
    : 열거형 이름 대신 실제 값이 사용되므로, 런타임에서 열거형 객체를 찾아 접근하는 코드 필요 없음.

  • 간접 참조 제거: 열거형 멤버 접근할 때 발생할 수 있는 추가적인 간접 참조 없어 코드 실행 속도 빨라짐

Ambient 열거형

이미 존재하는 열거형 타입을 묘사

declare enum Enum {
    A = 1,
    B, // 이건 계산된 멤버로 간주함
    C = 2
}

.d.ts(선언 파일)에 주로 사용됨.

declare로 선언된 열거형은, "이런 열거형이 존재하고, 이러한 모양을 하고 있다"는 것을 나타내지만, 그 실제 구현은 자바스크립트 코드 내에 존재하거나 다른 곳에서 제공되어야 함.

즉, 열거형을 위한 타입 선언이 Ambient 열거형

// Ambient 열거형 선언
declare enum Status {
  New,
  InProgress,
  Done,
}

// 이 열거형을 사용하는 타입스크립트 코드
let myStatus: Status = Status.New;

이렇게만 하면 당연히 오류 발생

0개의 댓글