1.1 Основы перечислений
Перечисления (Enums) в TypeScript представляют собой специальный тип данных, который позволяет определять набор именованных констант. Они используются для создания множества значений, которые имеют логическое и связанное между собой значение. На деле все проще, чем звучит: давайте разберем все подробно в этой лекции.
Объявление перечислений
Перечисления в TypeScript объявляются с использованием ключевого слова enum. Каждый элемент перечисления имеет числовое значение, которое автоматически увеличивается на единицу, начиная с нуля по умолчанию.
Пример:
"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
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.
Задание числовых значений
Вы можете явно задавать числовые значения элементам перечисления. Это позволяет контролировать начальные значения и порядок элементов.
Пример:
"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
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 поддерживает строковые перечисления, где каждому элементу перечисления присваивается строковое значение.
Пример:
"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
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 могут быть гетерогенными, то есть содержать как числовые, так и строковые значения. Однако рекомендуется избегать использования гетерогенных перечислений, так как их сложно поддерживать и считывать.
Пример:
"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
enum MixedEnum {
No = 0,
Yes = "YES"
}
console.log(MixedEnum.No); // Вывод: 0
console.log(MixedEnum.Yes); // Вывод: YES
1.2 Работа с перечислениями
Преобразование значений
Вы можете преобразовывать числовые значения в строки и наоборот, используя перечисления.
Пример:
"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
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.
Использование перечислений в функциях
Перечисления часто используются для определения параметров функций, что позволяет ограничить значения, которые можно передать в функцию.
Пример:
"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
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.
Пример:
"use strict";
let dir = 0 /* Direction.Up */;
console.log(dir); // Вывод: 0
const enum Direction {
Up,
Down,
Left,
Right
}
let dir: Direction = Direction.Up;
console.log(dir); // Вывод: 0
В этом примере константное перечисление Direction будет напрямую заменено своими значениями на этапе компиляции, что уменьшает размер конечного кода и повышает производительность.
1.3 Примеры
Примеры использования перечислений в реальных проектах
Перечисления широко используются в реальных проектах для повышения читаемости и надежности кода. Рассмотрим несколько примеров.
Пример 1: Статусы заказа
"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.
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: Роли пользователей
"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
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 используется для определения ролей пользователей и управления доступом на основе этих ролей.
Преимущества использования перечислений
- Повышение читаемости кода: перечисления позволяют использовать осмысленные имена вместо числовых или строковых значений, что делает код более понятным.
- Уменьшение ошибок: использование перечислений помогает избежать ошибок, связанных с использованием неправильных значений, так как компилятор TypeScript проверяет соответствие значений перечисления.
- Упрощение поддержки кода: перечисления облегчают поддержку и модификацию кода, так как добавление или изменение значений перечисления требует изменения только в одном месте.
- Улучшение типизации: перечисления обеспечивают строгую типизацию, что позволяет использовать их в качестве типов параметров функций и свойств объектов, улучшая надежность и предсказуемость кода.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ