여러가지 값들에 각각 이름을 부여해 열거해두고 사용하는 타입 (이넘 타입은 자바스크립트에는 없고, 타입스크립트에서만 존재하는 타입이다.)
각각의 멤버에 숫자가 지정되는걸 숫자형 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 Language {
korean = 'ko',
english = 'en',
}
const user1 = {
name: '히수',
language: Language.korean // ko
}
타입주석들은 컴파일 후 내용이 제거되지만, enum은 제거되지 않는다. 컴파일 후 생성된 js 파일을 보면 객체형태로 enum이 변환되어 있는걸 볼 수 있다.

강의를 보면서 enum도 결국 어떤 값을 저장해서 사용하는것이라는 생각이 들었다. 그렇다면 별도로 타입을 지정하지 않아도 되나? 찾아보니 enum으로 정의한 값들은 그 자체로 타입을 가지며, 실제로 리터럴 타입처럼 동작한다고 한다.
enum멤버는 값과 타입을 동시에 가지는 특성이 있어서, 별도로 타입을 선언하지 않아도 타입 안정성이 어느정도 보장된다.
enum Role {
ADMIN = 10,
USER,
GUEST
}
const a = Role.ADMIN // a는 10이라는 값이고, 타입도 number 리터럴 타입 10이 된다.