deep-dive-everything / typescript-with-react

우아한 타입스크립트 with 리액트 스터디
0 stars 0 forks source link

타입스크립트가 자동으로 추론한 열거형이 안전하지 않은 이유와 해결 방법에 대해 설명해주세요. #7

Closed hotdog1004 closed 1 month ago

hotdog1004 commented 1 month ago

📚 97p 📌 타입스크립트가 자동으로 추론한 열거형이 안전하지 않은 이유와 해결 방법에 대해 설명해주세요.

hotdog1004 commented 1 month ago

타입스크립트는 명명한 각 멤버의 값을 스스로 추론한다. 이 때 기본적으로 숫자 0부터 1씩 늘려가며 값을 할당한다. 이처럼 타입스크립트가 자동으로 추론한 열거형의 경우 숫자로만 이루어진 열거형처럼 역방향으로 접근이 가능하다. 만약 할당된 값을 넘어서는 범위로 역방향으로 접근할 경우 타입스크립트는 에러를 발생시키지 않고 undefined를 출력한다. 위와 같은 이유 때문에 타입스크립트가 자동으로 추론한 열거형은 안전하지 않다. 그리고 이러한 동작을 막기 위해 const enum으로 열거형을 선언하는 방법이 있다. const enum을 사용하면 역방향으로의 접근을 허용하지 않을 수 있다.

kwonhygge commented 1 month ago

숫자로만 이루어져 있거나 타입스크립트가 자동으로 추론한 열거형은 역방향으로도 접근할 수 있기 때문에 할당한 값을 넘어서는 범위로 접근하더라도 타입스크립트가 막지않습니다. 따라서 개발자가 예상치못한 버그를 발생시킬 수 있습니다. 이를 해결하기 위해 const enum이나 as const assertion을 사용하여 선언하여 안전하지만 열거형과 동일한 효과를 얻을 수 있습니다.

devsomda commented 1 month ago

숫자로만 이루어져 있거나 타입스크립트가 자동으로 추론한 열거형의 경우 할당된 값을 넘어서는 범위로 역방향 접근 하더라도 막지 않으며 별다른 에러를 발생시키지 않는다. 따라서 const enum이나 as assertion을 사용해 문제를 해결할 수 있다.

limejin commented 1 month ago

할당된 값을 넘어서는 범위로 역방향으로 접근하더라도 타입 스크립트가 막지 않기 때문이다. const enum으로 선언하고 숫자 상수 방식이 아닌 문자열 상수 방식으로 선언하여 안전성을 높일 수 있다.

samseburn commented 1 month ago

기본적으로 타입스크립트에서 열거형을 선언하면, 타입스크립트는 열거형의 각 요소에 숫자 값을 자동으로 할당합니다. 하지만 의도하지 않은 숫자 값들이 할당될 경우도 타입스크립트가 막아주지 못하기 떄문에, 예기치 못한 버그가 발생할 수 있습니다.

이러한 문제를 해결하기 위해서는 아래와 같은 방법을 권장합니다.