[TypeScript] 이넘(Enums)

Dam·2024년 1월 23일

[TypeScript]

목록 보기
4/11
post-thumbnail

이넘(Enums)

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

숫자형 이넘

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

enum Direction {
	Up = 1,  // 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 Wrong {
	A = getSomeValue(),
	B, // Error, 초기화가 필요합니다.
}

문자형 이넘

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

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

문자형 이넘에는 (숫자형 이넘과는 다르게) auto-incrementing이 없다.

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

복합 이넘

기술적으로 이넘에 문자와 숫자를 혼합하여 생성할 순 있지만, 최대한 같은 타입으로 이루어진 이넘을 사용하는 것이 좋다.

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

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

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

enum E {
	X, Y, Z
}

function getX(obj: { X: number }) {
	return obj.X;
}
getX(E);  // 이넘 E의 X는 숫자이기 때문에 정상 동작

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

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

enum LogLevel {
	ERROR, WARN, INFO, DEBUG
}

// 'ERROR' | 'WARN' | 'INFO' | 'DEBUG';
typeof 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');

리버스 매핑

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

enum Enum {
	A
}
let a = Enum.A;  // 키로 값을 획득
let keyName = Enum[a];  // 값으로 키를 획득
profile
⏰ Good things take time

0개의 댓글