TypeScript에서는 두 종류의 enum을 지원합니다:
또한 이종(enum)이 있지만, 그 사용은 권장되지 않습니다.
예시:
enum Status { Init, Loading, Ready = 5, Error } // Status.Error === 6 enum HttpCode { Ok = 200, NotFound = 404, Internal = 'INTERNAL_ERROR' // 오류! 문자열이나 숫자만 가능 } enum Direction { Up = 'UP', Down = 'DOWN', }
상수 값은 컴파일 단계에서 계산됩니다. ENUM 값이 다른 계산이나 표현식(예: 함수)에 의존하는 경우, 이는 계산된 값(computed member)으로 간주됩니다. 이전의 enum 멤버만을 사용하여 현재 멤버의 기본값을 계산할 수 있습니다.
중요한 특징:
새로운 enum 멤버 선언 시 다른 enum의 값을 사용할 수 있나요?
답변: 예, 다만 이 값이 상수이거나 이전에 선언된 멤버여야 합니다.
예시:
enum A { X = 1 } enum B { Y = A.X } // OK
그러나 함수 기반 계산이나 다른 곳의 데이터(예: 함수 호출)를 사용할 수는 없습니다.
이야기
외부 API에 데이터 직렬화를 위해 숫자 enum이 사용되었습니다. enum 멤버의 순서를 변경하였을 때 값이 "흐트러졌고", 외부 시스템에서 다른 숫자를 받기 시작했습니다. 이로 인해 외부 클라이언트에서 추적할 수 없는 잘못된 상태가 발생했습니다.
이야기
한 React 프로젝트에서 문자열 enum과 숫자 enum을 switch-case에 잘못 사용하여 값이 문자열로 변환될 것으로 기대했습니다. 불일치로 인해 switch가 제대로 작동하지 않았고, 구성 요소는 유효하지 않은 UI를 반환했습니다.
이야기
부분 값이 함수에 의해 계산되는 enum을 만들려고 했을 때, TypeScript는 오류를 던지지 않았지만 여러 번의 빌드에서 값이 undefined로 나타났습니다. 이는 enum이 경로의 식별자로 사용될 때 라우팅 문제를 일으켰습니다. 중요한 오류는 production bundle에서만 재현되었습니다.