enum 타입

여러가지 값들에 각각 이름을 부여해 열거해두고 사용하는 타입 (이넘 타입은 자바스크립트에는 없고, 타입스크립트에서만 존재하는 타입이다.)

숫자형 enum

각각의 멤버에 숫자가 지정되는걸 숫자형 enum 이라 한다.

enum Role {
    ADMIN = 0,
    USER = 1,
    GUEST = 2    
}

const user1 = {
    name: '히수',
    role: Role.ADMIN, // 0 관리자
}

enum타입은 숫자를 지정해주지 않아도 위에서부터 0부터 자동으로 숫자가 들어간다.

enum Role {
	ADMIN, // 0
	USER, // 1
	GUEST // 2
}
const user1 = {
    name: '히수',
    role: Role.ADMIN, // 0 관리자
}

제일 처음에 있는 멤버에게 숫자를 지정해주면 다음부터는 +1씩해서 들어간다.

enum Role {
	ADMIN = 10, // 10
	USER, // 11
	GUEST // 12
}
const user1 = {
    name: '히수',
    role: Role.USER, // 11 유저
}

중간부터 지정해주면 그전까지는 0부터 1씩증가, 지정해준 멤버를 기준으로 +1

enum Role {
	ADMIN , // 0
	USER, // 1
	GUEST = 12, // 12
	TEST // 13
}
const user1 = {
    name: '히수',
    role: Role.GUEST , // 12 게스트
}

문자형 enum

enum Language {
    korean = 'ko',
    english = 'en',
}

const user1 = {
    name: '히수',
    language: Language.korean // ko
}

컴파일 후 제거되지 않는다

타입주석들은 컴파일 후 내용이 제거되지만, enum은 제거되지 않는다. 컴파일 후 생성된 js 파일을 보면 객체형태로 enum이 변환되어 있는걸 볼 수 있다.

image.png

enum의 타입도 필요한가?

강의를 보면서 enum도 결국 어떤 값을 저장해서 사용하는것이라는 생각이 들었다. 그렇다면 별도로 타입을 지정하지 않아도 되나? 찾아보니 enum으로 정의한 값들은 그 자체로 타입을 가지며, 실제로 리터럴 타입처럼 동작한다고 한다.

enum멤버는 값과 타입을 동시에 가지는 특성이 있어서, 별도로 타입을 선언하지 않아도 타입 안정성이 어느정도 보장된다.

enum Role {
    ADMIN = 10,
    USER,
    GUEST
}

const a = Role.ADMIN // a는 10이라는 값이고, 타입도 number 리터럴 타입 10이 된다.