[TypeScript] 이넘 (Enums) #3

SOLEE_DEV·2021년 1월 16일
0

Typescript

목록 보기
3/10
post-thumbnail

본 포스팅은, '캡틴판교'님이 작성하신 '타입스크립트 핸드북'을 보고 스스로 정리하기 위해 작성하는 포스팅입니다. 자세한 내용은 https://joshua1988.github.io/를 참고해주세요!

1. 이넘 (Enums)

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

나이키
아디다스
뉴발란스

타입 스크립트에서는 문자형 이넘과 숫자형 이넘을 지원한다.

2. 숫자형 이넘

타입스크립트에서 숫자형 이넘은 아래와 같이 선언한다.

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

위와 같이 숫자형 이넘을 선언할 때 초기 값을 주면 초기 값부터 차례로 1씩 증가한다.
(초기 값을 주지 않으면 0부터 차례로 1씩 증가!)

숫자형 이넘 사용하기

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

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

respond("Captain Pangyo", Response.Yes);
// message의 type으로 Response enum을 지정!

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

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

3. 문자형 이넘

문자형 이넘은 이넘 값 전부 다 특정 문자, 다른 이넘 값으로 초기화해줘야 한다.

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

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

4. 복합 이넘

기술적으로 이넘에 문자와 숫자를 혼합해서 생성할 순 있지만, 보통 이 방식은 권고되지 않는다..
최대한 같은 타입으로 이루어진 이넘을 사용해야 한다.

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

이넘은 런타임시에 실제 객체 형태로 존재한다. 예를 들어 아래와 같은 이넘 코드가 있을 때

enum E {
  X,Y,Z
}

function getX(obj: {X: number}) {
  return obj.x;
}
getX(E); // 객체로써 접근 가능! E.X = 0 (숫자이기 때문에 정상 동작!)

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

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

enum LogLevel {
    ERROR, WARN, INFO, DEBUG
}

type LogLevelStrings = keyof typeof LogLevel;
// 'ERROR' | 'WARN' | 'INFO' | 'DEBUG';
// => 이렇게 enum의 key 값을 가져오기 위해서는 keyof typeof 이렇게 접근해야 됨!

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');

7. 리버스 매핑

숫자형 이넘에만 존재하는 특징으로, 에넘의 키(key)로 값(value)를 얻을 수 있고,
값(value)로 키(key)를 얻을 수도 있다.

enum Enum {
  A
}
let a = Enum.A; // 값 획득하기
let keyName = Enum[a]; // 값으로 키를 획득하기

!!!⚠️문자형 이넘에는 존재하지 않음⚠️!!!

profile
Front-End Developer

0개의 댓글