Enums allow you to define a set of named constants.
Numeric Enums
Default behavior - enum values are numbers starting from 0.
enum Direction {
Up, // 0
Down, // 1
Left, // 2
Right // 3
}
let direction: Direction = Direction.Up;
console.log(direction); // 0
Custom Numeric Values
enum Status {
Pending = 1,
Approved = 2,
Rejected = 3
}
// Or start from a specific number
enum Status {
Pending = 100,
Approved, // 101
Rejected // 102
}
String Enums
Each member must be initialized with a string.
enum Color {
Red = "red",
Green = "green",
Blue = "blue"
}
let color: Color = Color.Red;
console.log(color); // "red"
Heterogeneous Enums
Mix of string and numeric values (not recommended).
enum Mixed {
No = 0,
Yes = "yes"
}
Computed and Constant Members
enum FileAccess {
None, // 0 (constant)
Read = 1 << 1, // 2 (computed)
Write = 1 << 2, // 4 (computed)
ReadWrite = Read | Write // 6 (computed)
}
const Enums
Inlined at compile time - no JavaScript object is generated.
const enum Direction {
Up,
Down,
Left,
Right
}
let direction = Direction.Up;
// Compiles to: let direction = 0;
Reverse Mapping
Numeric enums create reverse mappings (not for string enums).
enum Direction {
Up = 1,
Down,
Left,
Right
}
console.log(Direction.Up); // 1
console.log(Direction[1]); // "Up" (reverse mapping)
When to Use Enums
Good Use Cases
-
Fixed set of constants
enum HttpStatus { OK = 200, NotFound = 404, ServerError = 500 } -
Flags/Bitwise operations
enum Permission { Read = 1, Write = 2, Execute = 4 } -
API response codes
enum ApiResponse { Success = "SUCCESS", Error = "ERROR", Pending = "PENDING" }
Alternatives to Enums
-
Union Types (often preferred)
type Direction = "up" | "down" | "left" | "right"; -
const objects
const Direction = { Up: "up", Down: "down", Left: "left", Right: "right" } as const;
Exercises
Exercise 1: Numeric Enum
// Create an enum called 'Priority' with:
// - Low = 1
// - Medium = 2
// - High = 3
// - Critical = 4
Exercise 2: String Enum
// Create an enum called 'UserRole' with:
// - Admin = "admin"
// - User = "user"
// - Guest = "guest"
Exercise 3: Enum Functions
// Create an enum 'HttpMethod' and a function that:
// - Takes an HttpMethod
// - Returns true if it's a safe method (GET, HEAD, OPTIONS)
Exercise 4: Enum with Flags
// Create an enum 'Permission' with bitwise flags:
// - Read = 1
// - Write = 2
// - Delete = 4
// Create functions to check and combine permissions
Best Practices
- Use string enums for better debugging - They preserve values in runtime
- Use const enums for performance - When you don't need runtime object
- Consider union types - Often simpler than enums
- Avoid heterogeneous enums - They're confusing
- Use enums for fixed sets - When values won't change
Common Mistakes
-
Using enums when union types would work
// ❌ Overkill enum Status { Active, Inactive } // ✅ Simpler type Status = "active" | "inactive"; -
Not initializing string enum members
// ❌ Error enum Color { Red, // Error: Enum member must have initializer Green, Blue } // ✅ Good enum Color { Red = "red", Green = "green", Blue = "blue" } -
Expecting reverse mapping in string enums
enum Direction { Up = "up" } // Direction["up"]; // ❌ undefined - no reverse mapping for string enums
Next Steps
Learn about Type Assertions.