본문 바로가기

프로그래밍기초/typescript

#06 TypeScript - Enum

 

1. Enum이란

Enum(열거형)은 서로 관련 있는 상수 값들의 집합을 하나의 타입으로 정의하기 위한 문법이다.

enum Direction {
  Up,
  Down,
  Left,
  Right
}
  • 의미 있는 이름으로 상수 집합을 표현할 수 있음
  • 숫자 또는 문자열 기반으로 동작함

 

 

2. Numeric Enum (숫자 열거형)

2.1 기본 동작

enum Direction {
  Up,
  Down,
  Left,
  Right
}

컴파일 시 내부 값은 다음과 같이 할당된다.

Direction.Up    === 0
Direction.Down  === 1
Direction.Left  === 2
Direction.Right === 3

 

 

 

2.2 시작 값 지정

enum Status {
  Ready = 1,
  Running,
  Done
}
  • Ready = 1
  • 이후 값은 자동 증가됨 (2, 3)

 

 

2.3 역방향 매핑

Numeric Enum은 양방향 매핑이 가능하다.

enum Status {
  Ready,
  Running
}

Status.Ready    // 0
Status[0]       // "Ready"
  • 런타임 객체가 생성됨
  • 이는 장점이자 단점이 될 수 있음

 

 

3. String Enum (문자열 열거형)

enum Direction {
  Up = "UP",
  Down = "DOWN",
  Left = "LEFT",
  Right = "RIGHT"
}
  • 값이 명확하고 직관적
  • 역방향 매핑 불가
  • 디버깅 및 로그에 유리
Direction.Up // "UP"

 

 

 

4. Const Enum

const enum Role {
  Admin,
  User
}
  • 컴파일 시 완전히 인라인됨
  • 런타임 객체 생성 없음
  • 성능 및 번들 크기 측면에서 유리
let r = Role.Admin;
// 컴파일 결과: let r = 0;

 

※ isolatedModules 옵션 사용 시 제한 있음

 

 

 

5. Enum 사용 예시

5.1 상태 값 표현

enum OrderStatus {
  Pending,
  Paid,
  Shipped,
  Completed
}

 

 

 

5.2 역할(Role) 구분

enum UserRole {
  Admin = "ADMIN",
  User = "USER"
}

 

 

 

5.3 switch 문과 함께 사용

function handle(status: OrderStatus) {
  switch (status) {
    case OrderStatus.Pending:
      // 처리
      break;
  }
}

 

 

 

6. Enum의 단점과 주의사항

1) 런타임 코드가 생성됨

enum A { X }

 

→ JavaScript로 컴파일 시 객체가 생성됨
→ 트리 쉐이킹에 불리

 

 

 

2) 타입 안정성이 완벽하지 않음

enum Status {
  Ready,
  Done
}

let s: Status = 100; // ❌ 컴파일 에러 아님
  • 숫자 Enum은 임의의 숫자 할당 가능
  • 논리적 안정성 저하 가능

 

 

 

7. Enum 대신 사용하는 패턴

7.1 Union Literal 타입 (권장)

type Direction = "UP" | "DOWN" | "LEFT" | "RIGHT";
  • 런타임 코드 없음
  • 타입 안정성 매우 높음
  • 트리 쉐이킹 친화적

 

 

 

7.2 as const 객체 패턴

const Direction = {
  Up: "UP",
  Down: "DOWN"
} as const;

type Direction = typeof Direction[keyof typeof Direction];
  • Enum과 유사한 사용성
  • 더 안전하고 유연함

 

 

 

8. 언제 Enum을 써야 하는가

상황권장

단순 상수 집합 Union 타입
런타임 객체 필요 Enum
외부 라이브러리 호환 Enum
프론트엔드 상태 값 Union / as const
백엔드(Spring 등) 연동 String Enum

 

 

 

반응형