--- sidebar_position: 7 --- # Enums и as const **Enum (перечисления)** в TypeScript — это способ определения набора именованных констант. Enums полезны, когда нужно работать с набором связанных значений, которые имеют смысл только в контексте друг друга. ## Пример Enum ```ts enum Direction { Up = "UP", Down = "DOWN", Left = "LEFT", Right = "RIGHT", } let move: Direction = Direction.Up; console.log(move); // "UP" ``` ## Особенности Enum ### 1. Числовые Enums: Если значения не указаны явно, TypeScript автоматически присваивает числа, начиная с 0. ```ts enum Status { Pending, // 0 Approved, // 1 Rejected, // 2 } ``` ### 2. Строковые Enums: Каждое значение должно быть явно указано. ```ts enum Direction { Up = "UP", Down = "DOWN", } ``` ### 3. Гетерогенные Enums: Можно смешивать строковые и числовые значения (но это не рекомендуется). ```ts enum Mixed { Yes = 1, No = "NO", } ``` ## Проблемы с Enum - **Генерируют дополнительный код:** Enums компилируются в JavaScript-объекты, что может увеличить размер кода. - **Не всегда интуитивно понятны:** Например, числовые Enums могут быть неочевидными. - **Сложности с деревомизацией (tree-shaking):** Enums могут мешать оптимизации кода при сборке. ### Замена Enum с помощью `as const` В TypeScript можно использовать объекты с **`as const`**, чтобы создать тип, аналогичный **Enum**, но без его недостатков. ```ts const Direction = { Up: "UP", Down: "DOWN", Left: "LEFT", Right: "RIGHT", } as const; type Direction = typeof Direction[keyof typeof Direction]; let move: Direction = Direction.Up; console.log(move); // "UP" ``` ### Преимущества `as const`: - **Без дополнительного кода:** **`as const`** не генерирует дополнительный код в JavaScript. - **Иммутабельность:** Значения становятся read-only. - **Деревоизация:** Легче оптимизировать при сборке. - **Гибкость:** Можно использовать строки, числа и другие типы. ### Пример с числовыми значениями: ```ts const Status = { Pending: 0, Approved: 1, Rejected: 2, } as const; type Status = typeof Status[keyof typeof Status]; let currentStatus: Status = Status.Approved; console.log(currentStatus); // 1 ``` ## Итог - **Enum** — это классический способ определения набора констант, но он имеет недостатки. - **`as const`** — это современная альтернатива, которая более гибкая и эффективная. Используйте **`as const`**, если хотите избежать недостатков Enum и сделать код более легковесным и оптимизированным. 🚀 **_Источник: DeepSeek_**