Note: If you're new to TypeScript, check our Getting Started with TypeScript tutorial first.
In TypeScript, enums (enumeration) are a data type that allows you to set a group of named constants.
Here's a simple example of enums. You can read the rest of the tutorial to learn more.
Example
enum Direction {
Up = "UP",
Down = "DOWN",
Left = "LEFT",
Right = "RIGHT"
}
// Using the enum to set a direction
const currentDirection = Direction.Up;
console.log("Moving in direction:", currentDirection);
// Output: Moving in direction: UP
Here, Direction
is enum
with possible values "UP"
, "DOWN"
, "LEFT"
and "RIGHT"
, and we've used Direction.Up
to set the movement direction.
Declaring an Enum
To declare an enum
, you use the enum
keyword followed by the name of the enum
.
enum enumName {
// Set of named members
}
Each member can be a numeric or string value, depending on the type of enum
you define.
Types of Enums
There are 2 types of enums.
- Numeric Enums
- String Enums
Let's learn about them in detail.
Numeric Enums
In numeric enums, we group related numeric constants under a single name.
By default, the first member of the numeric enum
is assigned the value 0, and each subsequent member's value is incremented by one.
enum Level {
Low, // Automatically set to 0
Medium, // Automatically set to 1
High // Automatically set to 2
}
console.log(Level.Low);
console.log(Level.Medium);
console.log(Level.High);
Output
0 1 2
Here, we have defined a numeric enum
named Level
with three members: Low
, Medium
and High
.
Member | Value |
---|---|
Low |
0 |
Medium |
1 |
High |
2 |
String Enums
The string enums allow you to assign string literals to the enum
members, providing a more meaningful way to handle named constants.
To define a string enum
, each member must be initialized with a string value.
enum Color {
Red = "RED",
Green = "GREEN",
Blue = "BLUE"
}
let favoriteColor: Color = Color.Green;
console.log("Favorite Color is:", favoriteColor);
Output
Favorite Color is: GREEN
Here, Color
is an enum
that helps manage a set of predefined string values associated with color names.
Notice that we have used Color
as a data type to define the favoriteColor
variable.
let favoriteColor: Color = Color.Green;
This means, favoriteColor
can only be assigned one of the values defined in the Color
enum.
Note: Enums ensure that the variables are assigned only from the predefined set of values.
Access Enum values
You can access the enum values in 2 ways:
1. Direct Member Access
2. Index Access
Consider the following example.
enum Day {
Sunday,
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday
}
// Direct member access
console.log("First day of the week:", Day.Sunday);
// Index access using a variable,
let dayIndex = Day.Monday;
console.log("Second day of the week:", Day[dayIndex]);
Output
First day of the week: 0 Second day of the week: Monday
Here,
1. Direct Member Access:
Day.Sunday
directly accesses the enum
member, which is automatically assigned the numeric value 0 as it's the first item.
2. Index Access:
Day[dayIndex]
uses an index variable (dayIndex
) to access the enum
. Here, dayIndex
is set to 1, corresponding to Monday
, and returns the name "Monday"
when used.
Why use Enums?
Enums are used for several reasons, some of which are highlighted below.
1. Improves Readability
Enums improve readability by providing meaningful names to sets of related values. For example,
With Enum
enum Direction {
North = 0,
East = 1,
South = 2,
West = 3
}
function turn(direction: Direction) {
console.log("Turning", Direction[direction]);
}
turn(Direction.North);
// Output: Turning North
Here, Direction.North
immediately conveys that the direction is north.
Without Enum
function turn(direction: number) {
const directions = ["North", "East", "South", "West"];
console.log("Turning", directions[direction]);
}
turn(0);
// Output: Turning North
It's not immediately clear what the number 0 represents unless you look at the array definition.
2. Reduces Errors
Enums prevent assigning invalid values that could lead to runtime errors. For example,
Suppose you need to manage user access levels within an application.
enum AccessLevel {
Guest,
User,
Admin
}
function setAccessLevel(level: AccessLevel) {
console.log("Your access level:", AccessLevel[level]);
}
setAccessLevel(AccessLevel.Admin);
setAccessLevel(AccessLevel.Super_Admin); // This would cause a compile-time error, as 'Super_Admin' is not a valid AccessLevel
When you try to pass Super_Admin
, which is not defined in the AccessLevel
enum, it results in a compile-time error.
3. Simplifies Refactoring
Changing the value of an enum member updates it across all usages in the codebase.
enum ServerStatus {
Offline,
Online,
Maintenance
}
function logStatus(status: ServerStatus) {
console.log("Server is currently", ServerStatus[status]);
}
logStatus(ServerStatus.Online);
Output
Server is currently Online
Suppose you need to add a new status Deprecated
to the ServerStaus
enum, you can do that:
enum ServerStatus {
Offline,
Online,
Deprecated, // Newly added
Maintenance // Index has shifted, but usage is correct.
}
Adding Deprecated
won't disrupt the existing code because references to other statuses like Maintenance
will still be correct, even if their positions change.
Also Read: