JavaRush /Курсы /Модуль 2: Fullstack /Типы перечислений (Enums)

Типы перечислений (Enums)

Модуль 2: Fullstack
6 уровень , 0 лекция
Открыта

1.1 Основы перечислений

Перечисления (Enums) в TypeScript представляют собой специальный тип данных, который позволяет определять набор именованных констант. Они используются для создания множества значений, которые имеют логическое и связанное между собой значение. На деле все проще, чем звучит: давайте разберем все подробно в этой лекции.

Объявление перечислений

Перечисления в TypeScript объявляются с использованием ключевого слова enum. Каждый элемент перечисления имеет числовое значение, которое автоматически увеличивается на единицу, начиная с нуля по умолчанию.

Пример:

JavaScript
    
      "use strict";
      var Direction;
      (function (Direction) {
          Direction[Direction["Up"] = 0] = "Up";
          Direction[Direction["Down"] = 1] = "Down";
          Direction[Direction["Left"] = 2] = "Left";
          Direction[Direction["Right"] = 3] = "Right";
      })(Direction || (Direction = {}));
      let move = Direction.Up;
      console.log(move); // Вывод: 0
    
  
TypeScript
    
      enum Direction {
        Up,
        Down,
        Left,
        Right
      }

      let move: Direction = Direction.Up;
      console.log(move); // Вывод: 0
    
  

В этом примере у перечисления Direction есть четыре члена: Up, Down, Left и Right. По умолчанию, Up имеет значение 0, Down — 1, Left — 2, а Right — 3.

Задание числовых значений

Вы можете явно задавать числовые значения элементам перечисления. Это позволяет контролировать начальные значения и порядок элементов.

Пример:

JavaScript
    
      "use strict";
      var Status;
      (function (Status) {
          Status[Status["New"] = 1] = "New";
          Status[Status["InProgress"] = 2] = "InProgress";
          Status[Status["Completed"] = 3] = "Completed";
          Status[Status["Closed"] = 10] = "Closed";
      })(Status || (Status = {}));
      console.log(Status.New); // Вывод: 1
      console.log(Status.InProgress); // Вывод: 2
      console.log(Status.Completed); // Вывод: 3
      console.log(Status.Closed); // Вывод: 10
    
  
TypeScript
    
      enum Status {
        New = 1,
        InProgress,
        Completed,
        Closed = 10
      }

      console.log(Status.New); // Вывод: 1
      console.log(Status.InProgress); // Вывод: 2
      console.log(Status.Completed); // Вывод: 3
      console.log(Status.Closed); // Вывод: 10
    
  

В этом примере элементу New присвоено значение 1. Элементы InProgress и Completed автоматически получают значения 2 и 3 соответственно, а элемент Closed имеет значение 10.

Строковые перечисления

Кроме числовых перечислений, TypeScript поддерживает строковые перечисления, где каждому элементу перечисления присваивается строковое значение.

Пример:

JavaScript
    
      "use strict";
      var Color;
      (function (Color) {
          Color["Red"] = "RED";
          Color["Green"] = "GREEN";
          Color["Blue"] = "BLUE";
      })(Color || (Color = {}));
      console.log(Color.Red); // Вывод: RED
      console.log(Color.Green); // Вывод: GREEN
      console.log(Color.Blue); // Вывод: BLUE
    
  
TypeScript
    
      enum Color {
        Red = "RED",
        Green = "GREEN",
        Blue = "BLUE"
      }

      console.log(Color.Red); // Вывод: RED
      console.log(Color.Green); // Вывод: GREEN
      console.log(Color.Blue); // Вывод: BLUE
    
  

Здесь каждому элементу перечисления Color присвоено строковое значение.

Гетерогенные перечисления

Перечисления в TypeScript могут быть гетерогенными, то есть содержать как числовые, так и строковые значения. Однако рекомендуется избегать использования гетерогенных перечислений, так как их сложно поддерживать и считывать.

Пример:

JavaScript
    
      "use strict";
      var MixedEnum;
      (function (MixedEnum) {
          MixedEnum[MixedEnum["No"] = 0] = "No";
          MixedEnum["Yes"] = "YES";
      })(MixedEnum || (MixedEnum = {}));
      console.log(MixedEnum.No); // Вывод: 0
      console.log(MixedEnum.Yes); // Вывод: YES
    
  
TypeScript
    
      enum MixedEnum {
        No = 0,
        Yes = "YES"
      }

      console.log(MixedEnum.No); // Вывод: 0
      console.log(MixedEnum.Yes); // Вывод: YES
    
  

1.2 Работа с перечислениями

Преобразование значений

Вы можете преобразовывать числовые значения в строки и наоборот, используя перечисления.

Пример:

JavaScript
    
      "use strict";
      var Days;
      (function (Days) {
          Days[Days["Monday"] = 0] = "Monday";
          Days[Days["Tuesday"] = 1] = "Tuesday";
          Days[Days["Wednesday"] = 2] = "Wednesday";
          Days[Days["Thursday"] = 3] = "Thursday";
          Days[Days["Friday"] = 4] = "Friday";
          Days[Days["Saturday"] = 5] = "Saturday";
          Days[Days["Sunday"] = 6] = "Sunday";
      })(Days || (Days = {}));
      let dayName = Days[2];
      console.log(dayName); // Вывод: Wednesday
      let dayIndex = Days.Saturday;
      console.log(dayIndex); // Вывод: 5
    
  
TypeScript
    
      enum Days {
        Monday,
        Tuesday,
        Wednesday,
        Thursday,
        Friday,
        Saturday,
        Sunday
      }

      let dayName: string = Days[2];
      console.log(dayName); // Вывод: Wednesday

      let dayIndex: number = Days.Saturday;
      console.log(dayIndex); // Вывод: 5
    
  

Здесь числовое значение 2 преобразуется в строку Wednesday, а строковое значение Saturday преобразуется в число 5.

Использование перечислений в функциях

Перечисления часто используются для определения параметров функций, что позволяет ограничить значения, которые можно передать в функцию.

Пример:

JavaScript
    
      "use strict";
      var Status;
      (function (Status) {
          Status[Status["New"] = 0] = "New";
          Status[Status["InProgress"] = 1] = "InProgress";
          Status[Status["Completed"] = 2] = "Completed";
      })(Status || (Status = {}));
      function updateStatus(status) {
          console.log(`The current status is: ${Status[status]}`);
      }
      updateStatus(Status.New); // Вывод: The current status is: New
      updateStatus(Status.Completed); // Вывод: The current status is: Completed
    
  
TypeScript
    
      enum Status {
        New,
        InProgress,
        Completed
      }

      function updateStatus(status: Status): void {
        console.log(`The current status is: ${Status[status]}`);
      }

      updateStatus(Status.New); // Вывод: The current status is: New
      updateStatus(Status.Completed); // Вывод: The current status is: Completed
    
  

Здесь функция updateStatus принимает параметр типа Status, что ограничивает возможные значения до элементов перечисления Status.

Константные перечисления

TypeScript поддерживает константные перечисления, которые оптимизируются на этапе компиляции. Они объявляются с использованием ключевого слова const.

Пример:

JavaScript
    
      "use strict";
      let dir = 0 /* Direction.Up */;
      console.log(dir); // Вывод: 0
    
  
TypeScript
    
      const enum Direction {
        Up,
        Down,
        Left,
        Right
      }

      let dir: Direction = Direction.Up;
      console.log(dir); // Вывод: 0
    
  

В этом примере константное перечисление Direction будет напрямую заменено своими значениями на этапе компиляции, что уменьшает размер конечного кода и повышает производительность.

1.3 Примеры

Примеры использования перечислений в реальных проектах

Перечисления широко используются в реальных проектах для повышения читаемости и надежности кода. Рассмотрим несколько примеров.

Пример 1: Статусы заказа

JavaScript
    
      "use strict";
      var OrderStatus;
      (function (OrderStatus) {
          OrderStatus[OrderStatus["Pending"] = 0] = "Pending";
          OrderStatus[OrderStatus["Shipped"] = 1] = "Shipped";
          OrderStatus[OrderStatus["Delivered"] = 2] = "Delivered";
          OrderStatus[OrderStatus["Cancelled"] = 3] = "Cancelled";
      })(OrderStatus || (OrderStatus = {}));
      function getOrderStatus(status) {
          switch (status) {
              case OrderStatus.Pending:
                  return "Your order is pending.";
              case OrderStatus.Shipped:
                  return "Your order has been shipped.";
              case OrderStatus.Delivered:
                  return "Your order has been delivered.";
              case OrderStatus.Cancelled:
                  return "Your order has been cancelled.";
              default:
                  return "Unknown status.";
          }
      }
      console.log(getOrderStatus(OrderStatus.Shipped)); // Вывод: Your order has been shipped.
    
  
TypeScript
    
      enum OrderStatus {
        Pending,
        Shipped,
        Delivered,
        Cancelled
      }

      function getOrderStatus(status: OrderStatus): string {
        switch (status) {
          case OrderStatus.Pending:
            return "Your order is pending.";
          case OrderStatus.Shipped:
            return "Your order has been shipped.";
          case OrderStatus.Delivered:
            return "Your order has been delivered.";
          case OrderStatus.Cancelled:
            return "Your order has been cancelled.";
          default:
            return "Unknown status.";
        }
      }

      console.log(getOrderStatus(OrderStatus.Shipped)); // Вывод: Your order has been shipped.
    
  

В этом примере перечисление OrderStatus используется для определения статусов заказа, что упрощает работу с ними и делает код более понятным.

Пример 2: Роли пользователей

JavaScript
    
      "use strict";
      var UserRole;
      (function (UserRole) {
          UserRole[UserRole["Admin"] = 0] = "Admin";
          UserRole[UserRole["User"] = 1] = "User";
          UserRole[UserRole["Guest"] = 2] = "Guest";
      })(UserRole || (UserRole = {}));
      function checkAccess(role) {
        if (role === UserRole.Admin) {
          console.log("Access granted: Admin");
        }
        else if (role === UserRole.User) {
          console.log("Access granted: User");
        }
        else {
          console.log("Access denied: Guest");
        }
      }
      checkAccess(UserRole.Admin); // Вывод: Access granted: Admin
      checkAccess(UserRole.Guest); // Вывод: Access denied: Guest
    
  
TypeScript
    
      enum UserRole {
        Admin,
        User,
        Guest
      }

      function checkAccess(role: UserRole): void {
        if (role === UserRole.Admin) {
          console.log("Access granted: Admin");
        } else if (role === UserRole.User) {
          console.log("Access granted: User");

        } else {
          console.log("Access denied: Guest");
        }
      }

      checkAccess(UserRole.Admin); // Вывод: Access granted: Admin
      checkAccess(UserRole.Guest); // Вывод: Access denied: Guest
    
  

Здесь перечисление UserRole используется для определения ролей пользователей и управления доступом на основе этих ролей.

Преимущества использования перечислений

  1. Повышение читаемости кода: перечисления позволяют использовать осмысленные имена вместо числовых или строковых значений, что делает код более понятным.
  2. Уменьшение ошибок: использование перечислений помогает избежать ошибок, связанных с использованием неправильных значений, так как компилятор TypeScript проверяет соответствие значений перечисления.
  3. Упрощение поддержки кода: перечисления облегчают поддержку и модификацию кода, так как добавление или изменение значений перечисления требует изменения только в одном месте.
  4. Улучшение типизации: перечисления обеспечивают строгую типизацию, что позволяет использовать их в качестве типов параметров функций и свойств объектов, улучшая надежность и предсказуемость кода.
3
Задача
Модуль 2: Fullstack, 6 уровень, 0 лекция
Недоступна
Определение дней недели
Определение дней недели
3
Задача
Модуль 2: Fullstack, 6 уровень, 0 лекция
Недоступна
Статусы заказа
Статусы заказа
3
Задача
Модуль 2: Fullstack, 6 уровень, 0 лекция
Недоступна
Перевод ролей пользователей
Перевод ролей пользователей
3
Задача
Модуль 2: Fullstack, 6 уровень, 0 лекция
Недоступна
Оценка состояния задачи
Оценка состояния задачи
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ