열거형: 이름 있는 상수들의 집합 정의
TS는 숫자, 문자열 기반 열거형 제공
enum Direction {
Up = 1,
Dwon, // 2
Left, // 3
Right, // 4
}
초기화된 숫자를 지정하지 않으면 자동으로 0부터 부여
enum Response {
No = 0,
Yes = 1,
}
function respond(recipient: string, message: Response): void {
// ...
}
respond("Princess Caroline", Response.Yes)
열거형은 상수 멤버와 계산된 멤버 두 가지가 있다.
컴파일 시 값이 결정
숫자 리터럴 또는 이전에 정의된 상수 열거형 멤버의 참조를 통해 초기화
실행 시에 그 값이 결정
함수 호출 결과나 계산된 표현식 포함
tsfunction getSomeValue(): number {
return 5;
}
enum E {
A = getSomeValue(), // 계산된 멤버
B, // 오류! A가 계산된 멤버이므로 B의 값을 자동으로 결정할 수 없습니다.
}
E.B는 자동으로 값을 할당받는데 A 값이 정해지지 않았기 때문에 오류가 발생
이 경우 계산된 멤버는 뒤로 가야 함.
열거형은 런타임에서 존재하는 객체이다.
열거형 멤버의 값으로 이름을 얻을 수 있는 기능(숫자 열거형에서만 가능)
enum Enum {
A
}
let a = Enum.A;
let nameOfA = Enum[a]; // "A"
단, 숫자형만 역 매핑을 생성하고 문자열 열거형은 역 매핑을 생성하지 않음.
const enum Enum {
A = 1,
B = A * 2
}
계산된 멤버에서는 못 씀.
컴파일 과정에서 완전히 제거됨.
(열거형을 사용하는 코드에 열거형 멤버 값이 직접 인라인 됨)
const enum Directions {
Up,
Down,
Left,
Right
}
let directions = [Directions.Up, Directions.Down, Directions.Left, Directions.Right]
JS 파일 크기 줄일 수 있음.
: 열거형 이름 대신 실제 값이 사용되므로, 런타임에서 열거형 객체를 찾아 접근하는 코드 필요 없음.
간접 참조 제거: 열거형 멤버 접근할 때 발생할 수 있는 추가적인 간접 참조 없어 코드 실행 속도 빨라짐
이미 존재하는 열거형 타입을 묘사
declare enum Enum {
A = 1,
B, // 이건 계산된 멤버로 간주함
C = 2
}
.d.ts(선언 파일)에 주로 사용됨.
declare로 선언된 열거형은, "이런 열거형이 존재하고, 이러한 모양을 하고 있다"는 것을 나타내지만, 그 실제 구현은 자바스크립트 코드 내에 존재하거나 다른 곳에서 제공되어야 함.
즉, 열거형을 위한 타입 선언이 Ambient 열거형
// Ambient 열거형 선언
declare enum Status {
New,
InProgress,
Done,
}
// 이 열거형을 사용하는 타입스크립트 코드
let myStatus: Status = Status.New;
이렇게만 하면 당연히 오류 발생