> For the complete documentation index, see [llms.txt](https://koziuk-s.gitbook.io/angular-starter/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://koziuk-s.gitbook.io/angular-starter/base-typescript/enums.md).

# Enums

**Enums** - *(це скорочення від слова enumerations перелічення)* ще один тип даних в TS, який дозволяє розробникам створювати набори іменованих констатн. Enums представляють собою фіксований набір значень, які не змінюються під час виконання програми, що робить наш код більш читабельним і менш схильним до помилок.

Приклад створеня enum.

{% code title="main.ts" overflow="wrap" lineNumbers="true" %}

```typescript
enum Priority {
  Low,
  Mid,
  High
};
```

{% endcode %}

Значення по дефолту, які не явно присвоюються елементам нашого enum, будуть числа від 0.

{% code title="main.ts" overflow="wrap" lineNumbers="true" %}

```typescript
enum Priority {
  Low,
  Mid,
  High
};

console.log(Priority.Low); // 0
console.log(Priority.Mid); // 1
```

{% endcode %}

Звісно ж ми можемо змінювати дефолтні значення на числа або стрічки.

{% code title="main.ts" overflow="wrap" lineNumbers="true" %}

```typescript
enum Priority {
  Low = 1,
  Mid,
  High
};

console.log(Priority.Low); // 1
console.log(Priority.Mid); // 2
```

{% endcode %}

{% hint style="info" %}
Зверніть увагу, що ми змінили лише значення першого елемента нашого enum, проте, наступні елементи, змінили його автоматично, так як enum - це перелічення.
{% endhint %}

Розглянемо приклад зі стрічками.

{% code title="main.ts" overflow="wrap" lineNumbers="true" %}

```typescript
enum Priority {
  Low = 'low',
  Mid = 'mid',
  High = 'high'
};

console.log(Priority.Low); // "low"
console.log(Priority.Mid); // "mid"

// Такий варіант видасть нам помилку
enum Direction {
  Up = 'up',
  Down, // ERROR: Enum member must have initializer.
  Left,
  Right,
};
```

{% endcode %}

#### Приклади виколистання

Один з прикладів використання Enum, це коли нам потрібно вказати не просто тип даних для якоїсь змінної, наприклад string чи number, а ми хочемо з акцентувати, що ми повинні сюди передати лише деякі конкретні виділені слова або числа.

{% code title="main.ts" overflow="wrap" lineNumbers="true" %}

```typescript
enum TooltipPosition {
  Top = 'top',
  Bottom = 'bottom',
  Left = 'left',
  Right = 'right',
};

function setTooltipPosition(position: TooltipPosition): void {
  switch (position) {
    case TooltipPosition.Top:
      console.log(`Position ${TooltipPosition.Top}`);
      break;
    case TooltipPosition.Bottom:
      console.log(`Position ${TooltipPosition.Bottom}`);
      break;
    case TooltipPosition.Left:
      console.log(`Position ${TooltipPosition.Left}`);
      break;
    case TooltipPosition.Right:
      console.log(`Position ${TooltipPosition.Right}`);
      break;
  }
}

setTooltipPosition('top'); // ERROR: Argument of type '"top"' is not assignable to parameter of type 'TooltipPosition'.
setTooltipPosition(TooltipPosition.Top); // "Position top" 
```

{% endcode %}

Як видно з даного прикладу, enum дозволяє нам конкретизувати значення яке ми очікуємо а також, помістивжи його в змінну, що позитивно впливає на відлагодження коду, та майбутню його підтримку чи розширення.

## Корисні посилання:

[TS Enums](https://www.typescriptlang.org/docs/handbook/enums.html)\
[W3schools - TypeScript Enums](https://www.w3schools.com/typescript/typescript_enums.php)
