본문 바로가기
TIL

타입스크립트 - enum

by 은지:) 2024. 8. 18.
728x90
반응형

 

열거형 타입 enum

 

전에도 한번 봤던 적 있는데

https://0119eunji.tistory.com/231

 

책에 나오길래 다시 정리

 

 

enum(열거형) 타입은

말 그대로 여러 상수를 나열하는 목적으로 쓰임

 

enum Status {
    New,
    InProgress,
    Completed,
    Cancelled
}

 

이런 enum이 있다면

var status = {
    "0" : 'New',
    "1" :'InProgress',
    "2" :'Completed',
    "3" :'Cancelled'
    New : 0,
    InProgress : 1,
    Completed : 2,
    Cancelled: 3
}

 

런타임시 이런 자바스크립트 코드가 됨

 

 

enum Status {
    New,
    InProgress,
    Completed,
    Cancelled
}

function updateStatus(status: Status) {
    switch (status) {
        case Status.New: //0
            console.log("Status is New");
            break;
        case Status.InProgress: //1
            console.log("Status is In Progress");
            break; 
        case Status.Completed: //2
            console.log("Status is Completed");
            break;
        case Status.Cancelled://3
            console.log("Status is Cancelled");
            break;
    }
}

updateStatus(Status.Completed); // "Status is Completed"

 

 

깔끔...

 

값이 0,1,2,3 이 싫다면 기본값 넣어주면 됨

하나 넣으면 다 넣긴 해야함

 

enum Status {
    New = "202",
    InProgress= "201",
    Completed= "203",
    Cancelled= "402"
}

 

 

하지만

enum의 문제는 자바스크립트로 변환되다보니 값을 넣을 수 있다는 거임

 

 

1.

enum Status {
    New = "202",
    InProgress= "201",
    Completed= "203",
    Cancelled= "402"
}

Status.news = 3 <= 에러 안 뜸


// Status 결과
{
  New: '202',
  InProgress: '201',
  Completed: '203',
  Cancelled: '402',
  news: 3
}

 

 

 

2. 이건 5.0에서 고쳐졌다고 함. 에러 뜸

enum Status {
    New,
    InProgress,
    Completed,
    Cancelled
}

Status[6]

 

 

 

3. 이건 고쳐져야 하는 사항.......

enum Status {
    New = "202",
    InProgress= "201",
    Completed= "203",
    Cancelled= "402"
}


function test (props: Status) {}
/** '"New"' 형식의 인수는 'Status' 형식의 매개 변수에 할당될 수 없습니다. */
test("New")
test(Status.New)

 

 

 

 

그럼 enum 어떻게 쓰면 좋을까

 

 

책에서는 브랜딩 타입이랑 같이 쓰고 as const 쓰면 좋다고 함

 

 

++

const 다는 순간 자바스크립트 객체는 안 만들어짐

const enum Status {
    New = "202",
    InProgress= "201",
    Completed= "203",
    Cancelled= "402"
}

 

그럼에도 Status.New 가 정상 작동하는 이유는

 

자바스크립트 객체만 만들어지지 않았을 뿐이지

컴파일 타임에 이미 "202"로 대체가 되어 있음

 

런타임시 enum이라는 객체에 접근해서 값을 가져오는 게 아니라

이미 값을 컴파일 시점에서 해당 값을 코드에 삽입해버리는 거임

 

=> 이걸 열거형 값을 상수 값과 그 키로 모두 인라인 처리 라고 표현함

 

 

728x90
반응형

'TIL' 카테고리의 다른 글

react - Suspense 이해 정리  (0) 2024.08.19
타입스크립트 - infer  (0) 2024.08.18
타입스크립트 - class  (0) 2024.08.18
타입스크립트 공변성, 반공변성  (0) 2024.08.11
타입스크립트 오버로딩  (0) 2024.08.11

댓글