# 이넘(enum)
이넘은 특정 값들의 집합을 의미하는 자료형입니다. 예를 들면 아래와 같은 목록이 이넘이 될 수 있습니다.
나이키
아디다스
뉴발란스
이넘은 다른 프로그래밍 언어를 다뤄본 사람들에게 친숙한 타입입니다. 타입스크립트에서는 문자형 이넘과 숫자형 이넘을 지원합니다.
# 숫자형 이넘
타입스크립트에서 숫자형 이넘은 아래와 같이 선언합니다.
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
}
# 숫자형 이넘 사용하기
이렇게 선언한 이넘은 아래와 같이 사용할 수 있습니다.
enum Response {
No = 0,
Yes = 1,
}
function respond(recipient: string, message: Response): void {
// ...
}
respond("Captain Pangyo", Response.Yes);
# 문자형 이넘
문자형 이넘은 앞에서 살펴본 숫자형 이넘과 개념적으로는 거의 비슷합니다. 다만, 런타임에서의 미세한 차이가 있습니다.
일단 문자형 이넘은 이넘 값 전부 다 특정 문자 또는 다른 이넘 값으로 초기화 해줘야 합니다.
enum Direction {
Up = "Up",
Down = "Down",
Left = "Left",
Right = "Right",
}
또한, 문자형 이넘에는 숫자형 이넘과는 다르게 auto-incrementing이 없습니다. 대신 디버깅을 할 때 숫자형 이넘의 값은 가끔 불명확하게 나올 떄가 있지만 문자형 이넘은 항상 명확한 값이 나와 읽기 편합니다.
# 복합 이넘(Heterogeneous Enums)
기술적으로 이넘에 문자와 숫자를 혼합하여 생성할 순 있습니다.
enum BooleanLikeHeterogeneousEnum {
No = 0,
Yes = "YES",
}
하지만 이 방식을 권고하진 않습니다. 최대한 같은 타입으로 이루어진 이넘을 사용하세요.
# 런타임 시점에서의 이넘 특징
이넘은 런타임시에 실제 객체 형태로 존재합니다. 따라서, 아래와 같은 코드가 있을 때 정상적으로 동작합니다.
enum Variables {
X, Y, Z
}
function getX(obj: { X: number }) {
return obj.X;
}
getX(Variables); // 0
함수의 인자로 이넘의 특정 속성이 아니라 이넘을 통으로 넘겼습니다. 이넘 코드가 자바스크립트로 컴파일 되면 다음과 같이 객체가 생성되기 때문에 위 코드는 정상적으로 0
이 출력됩니다.
// `Variables` 이넘을 컴파일 한 결과
var Variables;
(function (Variables) {
Variables[Variables["X"] = 0] = "X";
Variables[Variables["Y"] = 1] = "Y";
Variables[Variables["Z"] = 2] = "Z";
})(Variables || (Variables = {}));
# 컴파일 시점에서의 이넘 특징
이넘이 런타임 시점에서는 객체로 변환되지만 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);
console.log('Log level value is: ', num);
console.log('Log level message is: ', message);
}
}
printImportant('ERROR', 'This is a message');
# 리버스 매핑(Reverse Mapping)
리버스 매핑은 숫자형 이넘에만 존재하는 특징입니다. 에넘의 키(key)로 값(value)를 얻을 수 있고 값(value)로 키(key)를 얻을 수도 있습니다. 아래와 같이 말이죠.
enum Enum {
A
}
let a = Enum.A; // 키로 값을 획득 하기
let keyName = Enum[a]; // 값으로 키를 획득 하기
WARNING
위와 같은 리버스 매핑은 문자형 이넘에는 존재하지 않습니다.
# 강의와 책으로 더 쉽게 배워요 🎁
누적 수강생 8천명이 선택한 타입스크립트 입문 - 시작부터 실전까지 온라인 강의로 더 쉽게 배워볼 수 있어요 😃
강의와 함께 쉽게 시작하는 타입스크립트를 읽어보시면 실무에서 타입스크립트 코드가 전혀 두렵지 않을 겁니다 😃
← 인터페이스 연산자를 이용한 타입 정의 →