본문 바로가기
Javascript

타입스크립트 - Enums

by 안자바먹지 2021. 4. 8.
728x90

Enums

이넘(Enums)은 특정 값들의 집합을 의미하는 자료형이다.

 

숫자형 이넘

enum Ticket {
  R = 1,
  S,
  A
}

 

숫자형 이넘은 초기값을 정의하면 차례대로 1씩 증가한다. 만약 초기값을 정의하지 않으면 0부터 1씩 증가한다.

 

 

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


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

response('hello', Response.Yes)

 

또한 숫자형 이넘은 리버스 매핑을 할 수 있다. 리버스 매핑이란 이넘의 key로 value를 얻을 수 있고, value로도 key를 얻을 수 있는 특징을 말한다.

 

enum Enum {
 A
}

const a = Enum.A // key로 value 얻기
const keyName = Enum[a] // value로 key 얻기

 

 

문자형 이넘

문자형 이넘은 숫자형 이넘과 다르게 이넘 값 전부 초기화를 해주어야 한다.

 

enum Direction {
  Up = "Up",
  Down = "Down"
}

 

이넘에 문자와 숫자를 혼합하여 생성할 순 있지만 같은 타입의 이넘을 사용하는것이 좋다.

 

 

런타임 시점에서의 이넘

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

 

enum E {
 X, Y, Z
}

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

getX(E)

 

 

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

런타임 시점에서는 객체이지만 keyof를 사용할 때는 keyof typeof를 사용한다.

 

enum Log {
    ERROR,WANR,INFO,DEBUG
}

type LogLevelStrings = keyof typeof Log;

function printImportant(key: LogLevelStrings, message: string) {
    const num = Log[key]
    if (num <= Log.WANR) {
        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 message')

 

 

사용

 

enum Answer {
  Yes = 'Y',
  No = 'N'
}

function ask(answer: Answer) {
  if (answer === Answer.Yes) console.log('정답')
  if (answer === Answer.No) console.log('오답')
}

ask(Answer.Yes)
728x90

댓글