개발자

typescript enum은 지양해야하나요?

2022년 12월 26일조회 734

프로젝트 진행 중에 typescript enum 관련해서 팀원들과 의견이 갈려서 질문드립니다. 우선 기존 코드부터 설명드리면, enum Categories { Value, Value2, Value3 } 와 같은 형태가 있고 또 const categoryDataMap = { [Categories.Value]: { name: "카테고리1", }, [Categories.Value2]: { name: "카테고리2", }, [Categories.Value3]: { name: "카테고리3", } } const getCategoryDataByCategory = (category: Categories) => { return categoryDataMap[category] } 와 같은 mapper 오브젝트와 유틸 함수도 존재합니다. 저는 typescript 관련 공부를 했을때 enum 보다는 object as const를 사용하라고 배웠었는데요. 예를 들면 위의 코드를 const Categories = { 1: { name: "카테고리1" }, 2: { name: "카테고리2" }, 3: { name: "카테고리3" } } as const type CategoryKeys = keyof typeof Categories; const getCategoryDataByCategory = (category: CategoryKeys) => { return Categories[category] } 이렇게 바꿔줄수 있는데요. 저는 이 방법이 getCategoryDataByCategory를 사용했을때 category 인자의 타입이나 해당 함수가 리턴하는 타입이 더 명시적으로 나와서 편하다고 느꼈었습니다. 하지만, 팀원들은 다른 견해를 가지고 있었어요. 굳이 enum을 저렇게 바꿔야하는가? 라는 의문을 제기해주셨는데요. ---- 저도 typescript enum을 지양해야한다라고 어렴풋이 알고 있어서 "왜 굳이 enum인 친구들을 더 가독성이 떨어지는 후자의 방법으로 바꿔야하지"라는 궁금증이 생겨서 여쭤봅니다. 흔히 얘기하시는 enum 사용시 발생하는 treeshaking 문제는 enum을 cont enum으로 선언해주면 어느정도 해결되는 것 같은데, 굳이 const 형태로 바꿔줘야하는 이유가 있을까요? typescript에서 enum을 지양하라는 맥락에 대해 좀 더 구체적인 이유를 알고 싶습니다. 긴글 봐주셔서 감사합니다

이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.
profile picture
익명님의 질문

답변 3

배민근님의 프로필 사진

사실 많은 프로그래밍 언어에서 열거형을 사용하고 해당 문법으로 생산성이 증가하는데요. 하지만 Typescript의 열거형은 몇 가지 문제를 지니고 있습니다. 바로 예상과 다르게 동작하는 부분들이 있는데요! 1. 숫자형 enum의 경우 파라미터로 enum Something { A, B, C, D }를 해놓고 something(parameter: Something) 함수에 파라미터로 0,1,2,3 외에 다른 숫자를 집어넣어도 컴파일 시 에러가 나지 않습니다. 2. 문자형 enum의 경우 TS는 구조적 타이핑을 사용하는데 다른 타입과는 달리 enum의 경우는 명목적 타이핑을 사용합니다. 따라서, enum Something1 { A = 'A' }, enum Something2 { A = 'A' }에서 Something1.A === Something2.A 값은 실제로 같은 문자열임에도 불구하고 false입니다. TS를 빡빡하게 쓰신다면 애초에 겹칠 수 없는 값이라고 에디터나 IDE에서 안내할 것입니다. (Something1과 Something2가 객체라면 그러지 않았겠죠?) 이와 같이 TS에서 enum 동작은 예상과 달리 동작하는 부분들이 있긴 합니다. 질문에 작성하신 getCategoryDataByCategory의 파라미터 타입을 enum으로 하면 위에 말씀드린대로 음수나 1000 이런 값이 나와도 컴파일 시 오류를 거르지 못하니까요! 그러니 작성자분께서 뒤에 작성하신 코드가 아무래도 더 type safe하고 런타임에도 문제가 없을 코드이긴 합니다. 하지만 그럼에도 불구하고 저도.. enum을 잘 애용하고 있긴 합니다..ㅎ 아무래도 간결한 코드와 타입체크 그리고 생산성에 있어 쓰고 있는 것 같습니다. 질문하신대로 enum을 쓰지 않은 코드를 살펴보면 가독성이 떨어지긴 하니까요 ㅎㅎ TS에서 enum 논쟁은 언제나 끝이 없는거 같네요..! + 아 추가로 덧붙이자면 enum도 요샌 트리세이킹 문제가 항상 생기진 않는거 같더라구요..?

profile picture

익명

작성자

2022년 12월 27일

오 그렇군요.. 답변 감사합니다

손정현님의 프로필 사진

안녕하세요! 저도 최근에 유사한 궁금증이 생겨서 여러 글들을 읽어보았는데요. 우선 "const enum"의 경우도 제약 사항들이 여러가지 있다고 합니다. 사용하는 compiler에 따라서 지원을 하지 않을 수도 있고, 특정 상황에서 ambient enum일 경우 문제도 있다고해요. (참고: https://www.typescriptlang.org/tsconfig/#isolatedModules) 이건 결국 팀원들과 합의를 보면 되는 부분인 것 같습니다. enum을 사용해도 크게 문제가 되지 않는다면 사용해도 무방한 것 같아요. 하지만 말씀하신것처럼 typescript 공식문서에는 enum이 ECMAScript에 추가되면 사용하길 권장하고 있긴합니다. (참고: https://www.typescriptlang.org/docs/handbook/enums.html#objects-vs-enums) 저는 질문자님이 올려주신 방법 중 2번째 방법을 개인 프로젝트에서 종종 사용하는데요. 이유는 Categories라는 객체에서 필요하다면 여러가지 타입을 쉽게 뽑아낼 수도 있고, 말씀하신 것처럼 IDE에서 작업할때 인자나 함수 리턴 타입이 좀 더 명시적인 것 같아요. 그 외에는 위에 언급하신 enum 관련 문제들을 미연에 방지하기 위함인 것 같기도 하네요. 하지만, 팀원과의 협업이 중요한 환경이라면 충분한 논의를 통해서 정하는게 제일 좋을 것 같아요 :)

profile picture

익명

작성자

2022년 12월 27일

네 답변 감사합니다. 이 내용 가지고 팀원들과 다시 이야기 해봐야겠어요!

유근수님의 프로필 사진

얼마전 커리어리에 관련 주제 글이 있었는데, 링크해봅니다. 전 가독성에 이점이 있다고 생각해서 enum을 많이 쓰는 편입니다. 아직 별다른 문제는 겪진 않았는데, 어쩌면 문제가 생겼는데, 인지하지 못했을 수도 있고요. https://careerly.co.kr/comments/73975?utm_campaign=user-share

profile picture

익명

작성자

2022년 12월 27일

첨부해주신 글도 읽어보겠습니다. 감사합니다!

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

목록으로
키워드로 질문 모아보기

실무, 커리어 고민이 있다면

새로운 질문 올리기

지금 가입하면 모든 질문의 답변을 볼 수 있어요!