Discover how a small change in how you define options can save you hours of debugging!
Enum vs union literal type trade-offs in Typescript - When to Use Which
Imagine you have a list of fixed options, like colors or directions, and you write separate checks everywhere in your code to handle each option manually.
This manual checking is slow to write, easy to forget or mistype options, and hard to update when you add or remove choices. Bugs sneak in because the compiler can't help you catch mistakes.
Using enums or union literal types lets TypeScript help you manage these fixed sets of options safely and clearly. They catch errors early and make your code easier to read and maintain.
function move(direction: string) {
if (direction === 'up') { /*...*/ }
else if (direction === 'down') { /*...*/ }
// many more checks
}type Direction = 'up' | 'down' | 'left' | 'right'; function move(direction: Direction) { /*...*/ }
You can write safer, clearer code that the computer helps you check, reducing bugs and making changes easier.
When building a menu with fixed options, using enums or union types ensures you never miss an option or mistype a value, keeping your app stable and predictable.
Manual checks for fixed options are error-prone and hard to maintain.
Enums and union literal types let TypeScript enforce valid values.
This leads to safer, cleaner, and easier-to-update code.
Practice
Solution
Step 1: Understand enums and union literal types
Enums create named objects that exist in the generated JavaScript code at runtime. Union literal types only exist during TypeScript's type checking and do not produce runtime code.Step 2: Compare runtime presence
Since union literal types are erased after compilation, they cannot be used as runtime objects, unlike enums.Final Answer:
Enums create runtime objects, while union literal types only exist at compile time. -> Option AQuick Check:
Runtime object presence = A [OK]
- Thinking union types generate runtime code
- Believing enums cannot restrict values
- Confusing dynamic assignment capabilities
Solution
Step 1: Identify union literal type syntax
Union literal types use the syntax: type Name = 'value1' | 'value2' | 'value3';Step 2: Check options for correct syntax
type Colors = 'red' | 'green' | 'blue'; correctly uses the union literal type syntax. Options B and D misuse enum syntax, and C defines a tuple type, not a union.Final Answer:
type Colors = 'red' | 'green' | 'blue'; -> Option BQuick Check:
Union literal type syntax = A [OK]
- Using enum syntax for union types
- Using array syntax instead of union
- Assigning enum with = and union syntax mixed
enum StatusEnum { Active = 'active', Inactive = 'inactive' }
type StatusUnion = 'active' | 'inactive';
const enumValue = StatusEnum.Active;
const unionValue: StatusUnion = 'active';
console.log(enumValue === 'active');
console.log(unionValue === 'active');Solution
Step 1: Understand enum and union values
StatusEnum.Active is assigned the string 'active'. The unionValue is also the string 'active'.Step 2: Evaluate the console.log comparisons
Both enumValue === 'active' and unionValue === 'active' compare string 'active' to 'active', so both are true.Final Answer:
true true -> Option DQuick Check:
String equality for enum and union = D [OK]
- Assuming enum values are numbers by default
- Thinking enumValue is an object, not a string
- Confusing enum and union value types
enum Direction {
Up = 'UP',
Down = 'DOWN'
}
type DirectionUnion = 'UP' | 'DOWN';
function move(dir: DirectionUnion) {
console.log(dir);
}
move(Direction.Up);
move('LEFT');Solution
Step 1: Check function parameter type
Function move expects a parameter of type DirectionUnion, which allows only 'UP' or 'DOWN'.Step 2: Analyze function calls
Calling move(Direction.Up) passes 'UP', which is valid. Calling move('LEFT') passes a string not in the union, causing a type error.Final Answer:
Calling move with 'LEFT' causes a type error. -> Option CQuick Check:
Invalid union argument = B [OK]
- Assuming enum values are incompatible with union types
- Thinking missing enum values cause errors
- Believing function parameter types are flexible
// Option 1
enum UserRoleEnum { Admin = 'admin', User = 'user', Guest = 'guest' }
// Option 2
type UserRoleUnion = 'admin' | 'user' | 'guest';Solution
Step 1: Understand runtime and type safety needs
To check values at runtime, you need an actual JavaScript object. Enums generate this object. Union types only exist at compile time and do not generate code.Step 2: Compare options for runtime checks and type safety
UserRoleEnum provides both runtime presence and type safety. UserRoleUnion provides only type safety but no runtime object for checks.Final Answer:
Use UserRoleEnum because it creates a runtime object for checks and type safety. -> Option AQuick Check:
Runtime object + type safety = C [OK]
- Thinking union types generate runtime code
- Believing enums cannot restrict string values
- Assuming union types can be used for runtime checks
Ready to prove it?
Pass the test and this pattern moves unknown
