Skip to content

4. 이넘(Enums)


1. 이넘

  • 이넘은 특정 값들의 집합을 의미하는 자료형이다.
  • 예를 들면 다음과 같은 목록이 이넘이 될 수 있다.


나이키
아디다스
뉴발란스


2. 숫자형 이넘

  • 타입스크립트에서 숫자형 이넘은 다음과 같이 선언한다.


enum Direction {
  Up = 1,
  Down,
  Left,
  Right,
}


  • 위와 같이 숫자형 이넘을 선언할 때 초기 값을 주면 초기 값부터 차례로 1씩 증가한다.


Up - 1
Down - 2
Left - 3
Right - 4


  • 만약 다음과 같이 초기 값을 주지 않으면 0부터 차례로 1씩 증가한다.


enum Direction {
  Up, // 0
  Down, // 1
  Left, // 2
  Right, // 3
}


3. 숫자형 이넘 사용하기

  • 이렇게 선언한 이넘은 다음과 같이 사용할 수 있다.


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

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

respond("Captain Pangyo", Response.Yes);


  • 그리고 숫자형 이넘에서 주의할 점은 선언할 때 만약 이넘 값에 다른 이넘 타입의 값을 사용하면 선언하는 이넘의 첫 번째 값에 초기화를 해줘야 한다는 점이다.


enum Wrong {
  A = getSomeValue(),
  B, // 초기화가 필요하다.
}


4. 문자형 이넘

  • 문자형 이넘은 앞에서 살펴본 숫자형 이넘과 개념적으로 거의 비슷하다.
  • 일단 문자형 이넘은 이넘 값 전부 다 특정 문자 또는 다른 이넘 값을 초기화해줘야 한다.


enum Direction {
  Up = "UP",
  Down = "DOWN",
  Left = "LEFT",
  Right = "RIGHT",
}


  • 또한, 문자형 이넘에는 숫자형 이넘과는 다르게 Auto-incrementing이 없다.
  • 대신 디버깅을 할 때 숫자형 이넘의 값은 가끔 불명확하게 나올 때가 있지만 문자형 이넘은 항상 명확한 값이 나와 읽기 편한다.


5. 복합 이넘

  • 기술적으로 이넘에 문자와 숫자를 혼합하여 생성할 수는 있다.


enum BooleanLikeHeterogeneousEnum {
  No = 0,
  Yes = "YES",
}


  • 하지만 이 방식보다는 같은 타입으로 이루어진 이넘을 사용한다.


6. 런타임 시점에서의 이넘 특징

  • 이넘은 런타임 시에 실제 객체 형태로 존재한다.


enum E {
  X,
  Y,
  Z,
}

function getX(obj: { X: number }) {
  return obj.X;
}

getX(E); // 이넘 E의 X는 숫자이기 때문에 정상 동작


7. 컴파일 시점에서의 이넘 특징

  • 이넘이 런타임 시점에서는 실제 객체지만 keyof를 사용할 때 주의해야 한다.
  • 일반적으로 keyof를 사용해야 되는 상황에서는 대신 keyof typeof를 사용한다.


enum LogLevel {
  ERROR,
  WARN,
  INFO,
  DEBUG,
}

// '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); // ERROR
    console.log("Log level value is: ", num); // 0
    console.log("Log level message is: ", message); // This is a message
  }
}

printImportant("ERROR", "This is a message");


8. 리버스 매핑

  • 리버스 매핑은 숫자형 이넘에만 존재하는 특징이다.
  • 이넘의 키(Key)로 값(Value)를 얻을 수 있고 값으로 키를 얻을 수도 있다.


enum Enum {
  A,
}

let a = Enum.A; // 키로 값을 얻기
let keyName = Enum[a]; // 값으로 키를 얻기

References