---
sidebar_position: 8
---

# 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_**