기억보단 기록을/Typescript

[Typescript] Section 07. Enum

_OIL 2023. 5. 20. 22:03
반응형

1. 숫자형 이넘

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

function respond(message: Response): void {
  console.log(message)
}

respond( Response.Yes);
  • 위와 같이 숫자형 이넘을 선언할 때 초기 값을 주면 초기 값부터 차례로 1씩 증가합니다.
  • 초기 값을 주지 않으면 0부터 차례로 1씩 증가합니다.

2. 문자형 이넘

enum Direction {
    Up = "UP",
    Down = "DOWN",
    Left = "LEFT",
    Right = "RIGHT",
}
  • 문자형 이넘은 이넘 값 전부 다 특정 문자 또는 다른 이넘 값으로 초기화해줘야 합니다.
  • 문자형 이넘에는 숫자형 이넘과는 다르게 auto-incrementing이 없습니다. 대신 디버깅을 할 때 숫자형 이넘의 값은 불명확하게 나올 떄가 있지만 문자형 이넘은 항상 명확한 값이 나와 읽기 편합니다.

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

enum E {
  X, Y, Z
}

function getX(obj: { X: number }) {
  return obj.X;
}
getX(E); // 이넘 E의 X는 숫자이기 때문에 정상 동작
  • 이넘은 런타임시에 실제 객체 형태로 존재합니다.

4. 타입 시스템 시점에서의 이넘 특징

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);
       console.log('Log level value is: ', num);
       console.log('Log level message is: ', message);
    }
}
printImportant('ERROR', 'This is a message');
  • 이넘이 런타임 시점에서는 실제 객체지만 keyof를 사용할 때 주의해야 합니다. 일반적으로 keyof를 사용해야 되는 상황에서는 대신 keyof typeof를 사용하세요.

4. 리버스 매핑(Reverse Mapping)

enum Enum {
  A
}
let a = Enum.A; // 키로 값을 획득 하기
let keyName = Enum[a]; // 값으로 키를 획득 하기
  • 리버스 매핑은 숫자형 이넘에만 존재하는 특징입니다. 이넘의 키(key)로 값(value)을 얻을 수 있고 값(value)으로 키(key)를 얻을 수도 있습니다. 위와 같이 말이죠.
반응형