Enums considered harmful
스피커는 TypeScript enums이 JavaScript의 기본 기능이 아니며, 언어에 C# 객체 지향적인 느낌을 제공하기 위해 TypeScript에서 도입되었다고 설명합니다. 그러나 스피커는 enums가 런타임에서 예측할 수 없으며, 예상과 다르게 동작한다고 주장합니다. 예를 들어 "로그 레벨"이라는 enum을 만들면 기본값으로 debug, warning 및 error가 멤버로 설정됩니다. 그러나 스피커가 변환된 JavaScript를 확인하면, log level은 약간 다른 객체로 나타나며, debug가 0으로 할당되고, 그 결과 (0)이 log level 0에 할당되고, 그렇게 이어집니다. 이는 사용자가 log level에서 object.values를 수행하면, 예상과 다르게 0 debug, 1 warning 및 2 error를 얻게 됩니다. 스피커는 또한 TypeScript의 규칙 중 enums에 대한 규칙을 깨는데, 이는 TypeScript가 enums의 이름에 관심을 가진다는 것입니다. 이것은 TypeScript가 명명된 형(type) 시스템(nominal type system)이 되어, "로그 레벨" enum인지 "로그 레벨 2" enum인지에 따라 다르게 취급됩니다. 이것은 리팩토링을 쉽게 만드는 장점도 있지만, 어떤 개발자들에게는 문제가 될 수 있습니다. 이 문제를 해결하기 위해, 스피커는 enums 대신 "as const" 어노테이션이 지정된 일반적인 JavaScript 객체를 사용하는 것을 권장합니다. "as const" 어노테이션은 객체를 조작하거나 변경할 수 없음을 의미합니다. 이 방법을 사용하면 사용자는 객체에서 형(type)을 추출하고 변수의 형(type)을 지정하는 데 사용할 수 있습니다. 스피커는 이 방법이 enums보다 TypeScript의 구조적 형(type) 시스템에 더 잘 어울리며, 더 자연스럽고 직관적이라고 설명합니다. 또한 enums보다 훨씬 깨끗하고 읽고 쓰기 쉽습니다. 마지막으로, 스피커는 JavaScript에 enums을 기본 기능으로 가져오기 위한 제안을 언급합니다. 이 제안이 현실이 되면, 모든 사람들이 더 잘 문서화하고 이해할 수 있기 때문에 사용자는 enums을 더 예측 가능하게 사용할 수 있게 됩니다. 결론적으로, 스피커는 TypeScript로 작업할 때 enums은 최선의 선택이 아니며, 대신 "as const" 어노테이션이 지정된 일반적인 JavaScript 객체를 사용하는 것을 제안합니다.