Chapter 9: TypeScript Enums
TypeScript Enums. Some developers love them, some avoid them, but understanding them is crucial for writing effective TypeScript. Think of enums as creating your own vocabulary – instead of using magic numbers or random strings scattered throughout your code, you create meaningful, self-documenting constants.
Let me tell you a story first.
Imagine you’re building a weather app. Without enums, you might write:
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<span class="token comment">// What does 0 mean? What does 1 mean? Who knows!</span> <span class="token keyword">function</span> <span class="token function">getWeatherIcon</span><span class="token punctuation">(</span>code<span class="token operator">:</span> <span class="token builtin">number</span><span class="token punctuation">)</span><span class="token operator">:</span> <span class="token builtin">string</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>code <span class="token operator">===</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token string">"☀️"</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>code <span class="token operator">===</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token string">"☁️"</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>code <span class="token operator">===</span> <span class="token number">2</span><span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token string">"🌧️"</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token string">"❓"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// Somewhere else in your code...</span> <span class="token function">getWeatherIcon</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// What is 0? Sunny? Clear? No idea!</span> |
This is a nightmare. What is 0? Why 0? Did someone mean 0 or did they just forget to set a value? Enums solve this elegantly:
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<span class="token keyword">enum</span> WeatherCondition <span class="token punctuation">{</span> Sunny<span class="token punctuation">,</span> Cloudy<span class="token punctuation">,</span> Rainy <span class="token punctuation">}</span> <span class="token keyword">function</span> <span class="token function">getWeatherIcon</span><span class="token punctuation">(</span>condition<span class="token operator">:</span> WeatherCondition<span class="token punctuation">)</span><span class="token operator">:</span> <span class="token builtin">string</span> <span class="token punctuation">{</span> <span class="token keyword">switch</span> <span class="token punctuation">(</span>condition<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">case</span> WeatherCondition<span class="token punctuation">.</span>Sunny<span class="token operator">:</span> <span class="token keyword">return</span> <span class="token string">"☀️"</span><span class="token punctuation">;</span> <span class="token keyword">case</span> WeatherCondition<span class="token punctuation">.</span>Cloudy<span class="token operator">:</span> <span class="token keyword">return</span> <span class="token string">"☁️"</span><span class="token punctuation">;</span> <span class="token keyword">case</span> WeatherCondition<span class="token punctuation">.</span>Rainy<span class="token operator">:</span> <span class="token keyword">return</span> <span class="token string">"🌧️"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token comment">// Crystal clear!</span> <span class="token function">getWeatherIcon</span><span class="token punctuation">(</span>WeatherCondition<span class="token punctuation">.</span>Sunny<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// "☀️"</span> |
Now let’s dive deep into everything you need to know about enums.
Part 1: What Exactly IS an Enum?
An enum (short for “enumeration”) is a way to define a set of named constants. Think of it as creating a new type that can only be one of several possible values.
Basic Syntax
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<span class="token keyword">enum</span> Direction <span class="token punctuation">{</span> Up<span class="token punctuation">,</span> Down<span class="token punctuation">,</span> Left<span class="token punctuation">,</span> Right <span class="token punctuation">}</span> <span class="token comment">// Usage</span> <span class="token keyword">let</span> myDirection<span class="token operator">:</span> Direction <span class="token operator">=</span> Direction<span class="token punctuation">.</span>Up<span class="token punctuation">;</span> |
Behind the scenes, TypeScript assigns numbers to these names:
|
0 1 2 3 4 5 6 7 8 9 |
Direction<span class="token punctuation">.</span>Up <span class="token operator">===</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token comment">// true</span> Direction<span class="token punctuation">.</span>Down <span class="token operator">===</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token comment">// true</span> Direction<span class="token punctuation">.</span>Left <span class="token operator">===</span> <span class="token number">2</span><span class="token punctuation">;</span> <span class="token comment">// true</span> Direction<span class="token punctuation">.</span>Right <span class="token operator">===</span> <span class="token number">3</span><span class="token punctuation">;</span> <span class="token comment">// true</span> |
Part 2: Numeric Enums (The Default)
Auto-incrementing Values
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<span class="token keyword">enum</span> Status <span class="token punctuation">{</span> Pending<span class="token punctuation">,</span> <span class="token comment">// 0</span> Approved<span class="token punctuation">,</span> <span class="token comment">// 1</span> Rejected<span class="token punctuation">,</span> <span class="token comment">// 2</span> Shipped<span class="token punctuation">,</span> <span class="token comment">// 3</span> Delivered <span class="token comment">// 4</span> <span class="token punctuation">}</span> <span class="token builtin">console</span><span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>Status<span class="token punctuation">.</span>Pending<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 0</span> <span class="token builtin">console</span><span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>Status<span class="token punctuation">.</span>Approved<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 1</span> <span class="token builtin">console</span><span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>Status<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// "Approved" - Reverse mapping!</span> |
Custom Starting Values
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<span class="token keyword">enum</span> ErrorCode <span class="token punctuation">{</span> NotFound <span class="token operator">=</span> <span class="token number">404</span><span class="token punctuation">,</span> Unauthorized <span class="token operator">=</span> <span class="token number">401</span><span class="token punctuation">,</span> Forbidden <span class="token operator">=</span> <span class="token number">403</span><span class="token punctuation">,</span> InternalServerError <span class="token operator">=</span> <span class="token number">500</span> <span class="token punctuation">}</span> <span class="token comment">// Auto-increment continues from the last custom value</span> <span class="token keyword">enum</span> GameLevel <span class="token punctuation">{</span> Easy <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token comment">// 1</span> Medium<span class="token punctuation">,</span> <span class="token comment">// 2</span> Hard<span class="token punctuation">,</span> <span class="token comment">// 3</span> Expert <span class="token operator">=</span> <span class="token number">10</span><span class="token punctuation">,</span> <span class="token comment">// 10</span> Master <span class="token comment">// 11</span> <span class="token punctuation">}</span> |
Computed Values
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<span class="token keyword">enum</span> Flags <span class="token punctuation">{</span> Read <span class="token operator">=</span> <span class="token number">1</span> <span class="token operator"><<</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token comment">// 1</span> Write <span class="token operator">=</span> <span class="token number">1</span> <span class="token operator"><<</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token comment">// 2</span> Execute <span class="token operator">=</span> <span class="token number">1</span> <span class="token operator"><<</span> <span class="token number">2</span> <span class="token comment">// 4</span> <span class="token punctuation">}</span> <span class="token comment">// Mixing computed and constant members</span> <span class="token keyword">enum</span> FileAccess <span class="token punctuation">{</span> None <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">,</span> Read <span class="token operator">=</span> <span class="token number">1</span> <span class="token operator"><<</span> <span class="token number">0</span><span class="token punctuation">,</span> Write <span class="token operator">=</span> <span class="token number">1</span> <span class="token operator"><<</span> <span class="token number">1</span><span class="token punctuation">,</span> ReadWrite <span class="token operator">=</span> Read <span class="token operator">|</span> Write<span class="token punctuation">,</span> <span class="token comment">// Computed</span> User <span class="token operator">=</span> <span class="token number">1</span> <span class="token operator"><<</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token comment">// 4</span> Admin <span class="token operator">=</span> User <span class="token operator">|</span> ReadWrite <span class="token comment">// Computed (4 | 3 = 7)</span> <span class="token punctuation">}</span> |
Part 3: String Enums
Numeric enums are great, but string enums are often more readable and debuggable:
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<span class="token keyword">enum</span> Direction <span class="token punctuation">{</span> Up <span class="token operator">=</span> <span class="token string">"UP"</span><span class="token punctuation">,</span> Down <span class="token operator">=</span> <span class="token string">"DOWN"</span><span class="token punctuation">,</span> Left <span class="token operator">=</span> <span class="token string">"LEFT"</span><span class="token punctuation">,</span> Right <span class="token operator">=</span> <span class="token string">"RIGHT"</span> <span class="token punctuation">}</span> <span class="token comment">// Now the values are meaningful strings</span> <span class="token builtin">console</span><span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>Direction<span class="token punctuation">.</span>Up<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// "UP" - much clearer than 0!</span> |
Important: String enums don’t have reverse mapping:
|
0 1 2 3 4 5 6 7 |
Direction<span class="token punctuation">[</span><span class="token string">"UP"</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token comment">// Error! Property 'UP' doesn't exist on type 'typeof Direction'</span> Direction<span class="token punctuation">.</span>Up<span class="token punctuation">;</span> <span class="token comment">// "UP" - This is the only way</span> |
Real-World Example: HTTP Methods
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<span class="token keyword">enum</span> HttpMethod <span class="token punctuation">{</span> Get <span class="token operator">=</span> <span class="token string">"GET"</span><span class="token punctuation">,</span> Post <span class="token operator">=</span> <span class="token string">"POST"</span><span class="token punctuation">,</span> Put <span class="token operator">=</span> <span class="token string">"PUT"</span><span class="token punctuation">,</span> Delete <span class="token operator">=</span> <span class="token string">"DELETE"</span><span class="token punctuation">,</span> Patch <span class="token operator">=</span> <span class="token string">"PATCH"</span><span class="token punctuation">,</span> Head <span class="token operator">=</span> <span class="token string">"HEAD"</span><span class="token punctuation">,</span> Options <span class="token operator">=</span> <span class="token string">"OPTIONS"</span> <span class="token punctuation">}</span> <span class="token keyword">function</span> <span class="token function">makeRequest</span><span class="token punctuation">(</span>url<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">,</span> method<span class="token operator">:</span> HttpMethod<span class="token punctuation">,</span> data<span class="token operator">?</span><span class="token operator">:</span> <span class="token builtin">any</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// Type-safe HTTP methods!</span> <span class="token function">fetch</span><span class="token punctuation">(</span>url<span class="token punctuation">,</span> <span class="token punctuation">{</span> method<span class="token punctuation">,</span> body<span class="token operator">:</span> <span class="token constant">JSON</span><span class="token punctuation">.</span><span class="token function">stringify</span><span class="token punctuation">(</span>data<span class="token punctuation">)</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function">makeRequest</span><span class="token punctuation">(</span><span class="token string">"/api/users"</span><span class="token punctuation">,</span> HttpMethod<span class="token punctuation">.</span>Get<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// ✓ Clear intent</span> <span class="token function">makeRequest</span><span class="token punctuation">(</span><span class="token string">"/api/users"</span><span class="token punctuation">,</span> <span class="token string">"GET"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Error! Must use enum</span> <span class="token function">makeRequest</span><span class="token punctuation">(</span><span class="token string">"/api/users"</span><span class="token punctuation">,</span> HttpMethod<span class="token punctuation">.</span>Post<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// ✓</span> |
Part 4: Heterogeneous Enums (Mix of Strings and Numbers)
You CAN mix string and numeric members, but PLEASE don’t. It’s confusing and rarely useful:
|
0 1 2 3 4 5 6 7 8 9 10 11 12 |
<span class="token comment">// Technically possible, but don't do this</span> <span class="token keyword">enum</span> BooleanLikeHeterogeneousEnum <span class="token punctuation">{</span> No <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">,</span> Yes <span class="token operator">=</span> <span class="token string">"YES"</span><span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token comment">// Just... don't. Your teammates will hate you.</span> |
Part 5: Const Enums – The Performance Optimizer
Regular enums compile to JavaScript objects. Const enums compile away completely:
Regular Enum
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<span class="token keyword">enum</span> Colors <span class="token punctuation">{</span> Red<span class="token punctuation">,</span> Green<span class="token punctuation">,</span> Blue <span class="token punctuation">}</span> <span class="token comment">// Compiles to:</span> <span class="token keyword">var</span> Colors<span class="token punctuation">;</span> <span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span>Colors<span class="token punctuation">)</span> <span class="token punctuation">{</span> Colors<span class="token punctuation">[</span>Colors<span class="token punctuation">[</span><span class="token string">"Red"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string">"Red"</span><span class="token punctuation">;</span> Colors<span class="token punctuation">[</span>Colors<span class="token punctuation">[</span><span class="token string">"Green"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string">"Green"</span><span class="token punctuation">;</span> Colors<span class="token punctuation">[</span>Colors<span class="token punctuation">[</span><span class="token string">"Blue"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string">"Blue"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">(</span>Colors <span class="token operator">||</span> <span class="token punctuation">(</span>Colors <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
Const Enum
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<span class="token keyword">const</span> <span class="token keyword">enum</span> Colors <span class="token punctuation">{</span> Red<span class="token punctuation">,</span> Green<span class="token punctuation">,</span> Blue <span class="token punctuation">}</span> <span class="token keyword">let</span> color <span class="token operator">=</span> Colors<span class="token punctuation">.</span>Red<span class="token punctuation">;</span> <span class="token comment">// Compiles to:</span> <span class="token keyword">let</span> color <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token comment">// Directly inlined! No object created</span> |
When to use const enums: When performance matters and you don’t need reverse mapping. But be careful – some bundlers/tools handle them differently.
Part 6: Ambient Enums (Declaration Files)
Used when describing existing JavaScript libraries:
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<span class="token comment">// In a .d.ts file</span> <span class="token keyword">declare</span> <span class="token keyword">enum</span> ExternalLibraryEvents <span class="token punctuation">{</span> Click <span class="token operator">=</span> <span class="token string">"click"</span><span class="token punctuation">,</span> Hover <span class="token operator">=</span> <span class="token string">"hover"</span><span class="token punctuation">,</span> Focus <span class="token operator">=</span> <span class="token string">"focus"</span><span class="token punctuation">,</span> Blur <span class="token operator">=</span> <span class="token string">"blur"</span> <span class="token punctuation">}</span> <span class="token comment">// You're just describing, not implementing</span> |
Part 7: The Famous Enum Debate
Enums are controversial. Let me give you both sides honestly:
Why Some Developers Avoid Enums
-
They’re not a real JavaScript feature – Enums are TypeScript-only
-
Tree-shaking problems – Some bundlers struggle with enum objects
-
Const enums can cause issues – With certain build tools
-
Union types often work just as well
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 |
<span class="token comment">// Instead of enum, some prefer:</span> <span class="token keyword">const</span> Status <span class="token operator">=</span> <span class="token punctuation">{</span> Pending<span class="token operator">:</span> <span class="token string">'pending'</span><span class="token punctuation">,</span> Approved<span class="token operator">:</span> <span class="token string">'approved'</span><span class="token punctuation">,</span> Rejected<span class="token operator">:</span> <span class="token string">'rejected'</span> <span class="token punctuation">}</span> <span class="token keyword">as</span> <span class="token keyword">const</span><span class="token punctuation">;</span> <span class="token keyword">type</span> <span class="token class-name">Status</span> <span class="token operator">=</span> <span class="token keyword">typeof</span> Status<span class="token punctuation">[</span><span class="token keyword">keyof</span> <span class="token keyword">typeof</span> Status<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token comment">// "pending" | "approved" | "rejected"</span> |
Why Many Developers Love Enums
-
Self-documenting – Clear, named constants
-
Easy refactoring – Change the value once, update everywhere
-
Reverse mapping – Find the name from the value
-
Explicit intent – “This value can only be one of these”
My take: Use enums when you need:
-
Both the name AND the value at runtime
-
Reverse mapping
-
Clear, centralized constant definitions
-
To work with numeric values meaningfully
Part 8: Advanced Enum Patterns
Enum as Flags (Bit Masks)
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<span class="token keyword">enum</span> Permissions <span class="token punctuation">{</span> None <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">,</span> Read <span class="token operator">=</span> <span class="token number">1</span> <span class="token operator"><<</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token comment">// 1</span> Write <span class="token operator">=</span> <span class="token number">1</span> <span class="token operator"><<</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token comment">// 2</span> Delete <span class="token operator">=</span> <span class="token number">1</span> <span class="token operator"><<</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token comment">// 4</span> Manage <span class="token operator">=</span> <span class="token number">1</span> <span class="token operator"><<</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token comment">// 8</span> Admin <span class="token operator">=</span> Read <span class="token operator">|</span> Write <span class="token operator">|</span> Delete <span class="token operator">|</span> Manage <span class="token comment">// 15</span> <span class="token punctuation">}</span> <span class="token comment">// Check permissions</span> <span class="token keyword">function</span> <span class="token function">hasPermission</span><span class="token punctuation">(</span>userPerms<span class="token operator">:</span> Permissions<span class="token punctuation">,</span> required<span class="token operator">:</span> Permissions<span class="token punctuation">)</span><span class="token operator">:</span> <span class="token builtin">boolean</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token punctuation">(</span>userPerms <span class="token operator">&</span> required<span class="token punctuation">)</span> <span class="token operator">===</span> required<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// Grant permissions</span> <span class="token keyword">let</span> userPerms <span class="token operator">=</span> Permissions<span class="token punctuation">.</span>Read <span class="token operator">|</span> Permissions<span class="token punctuation">.</span>Write<span class="token punctuation">;</span> <span class="token comment">// 3</span> <span class="token function">hasPermission</span><span class="token punctuation">(</span>userPerms<span class="token punctuation">,</span> Permissions<span class="token punctuation">.</span>Read<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// true</span> <span class="token function">hasPermission</span><span class="token punctuation">(</span>userPerms<span class="token punctuation">,</span> Permissions<span class="token punctuation">.</span>Delete<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// false</span> |
Enum with Static Methods
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
<span class="token keyword">enum</span> Weekday <span class="token punctuation">{</span> Monday<span class="token punctuation">,</span> Tuesday<span class="token punctuation">,</span> Wednesday<span class="token punctuation">,</span> Thursday<span class="token punctuation">,</span> Friday<span class="token punctuation">,</span> Saturday<span class="token punctuation">,</span> Sunday <span class="token punctuation">}</span> <span class="token keyword">namespace</span> Weekday <span class="token punctuation">{</span> <span class="token keyword">export</span> <span class="token keyword">function</span> <span class="token function">isBusinessDay</span><span class="token punctuation">(</span>day<span class="token operator">:</span> Weekday<span class="token punctuation">)</span><span class="token operator">:</span> <span class="token builtin">boolean</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> day <span class="token operator">>=</span> Weekday<span class="token punctuation">.</span>Monday <span class="token operator">&&</span> day <span class="token operator"><=</span> Weekday<span class="token punctuation">.</span>Friday<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">export</span> <span class="token keyword">function</span> <span class="token function">isWeekend</span><span class="token punctuation">(</span>day<span class="token operator">:</span> Weekday<span class="token punctuation">)</span><span class="token operator">:</span> <span class="token builtin">boolean</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> day <span class="token operator">===</span> Weekday<span class="token punctuation">.</span>Saturday <span class="token operator">||</span> day <span class="token operator">===</span> Weekday<span class="token punctuation">.</span>Sunday<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">export</span> <span class="token keyword">function</span> <span class="token function">toString</span><span class="token punctuation">(</span>day<span class="token operator">:</span> Weekday<span class="token punctuation">)</span><span class="token operator">:</span> <span class="token builtin">string</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> Weekday<span class="token punctuation">[</span>day<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token comment">// Usage</span> <span class="token keyword">let</span> today <span class="token operator">=</span> Weekday<span class="token punctuation">.</span>Monday<span class="token punctuation">;</span> <span class="token builtin">console</span><span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>Weekday<span class="token punctuation">.</span><span class="token function">isBusinessDay</span><span class="token punctuation">(</span>today<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// true</span> <span class="token builtin">console</span><span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>Weekday<span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">(</span>today<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// "Monday"</span> |
Enum with Descriptions
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
<span class="token keyword">enum</span> HttpStatus <span class="token punctuation">{</span> <span class="token constant">OK</span> <span class="token operator">=</span> <span class="token number">200</span><span class="token punctuation">,</span> BadRequest <span class="token operator">=</span> <span class="token number">400</span><span class="token punctuation">,</span> Unauthorized <span class="token operator">=</span> <span class="token number">401</span><span class="token punctuation">,</span> Forbidden <span class="token operator">=</span> <span class="token number">403</span><span class="token punctuation">,</span> NotFound <span class="token operator">=</span> <span class="token number">404</span><span class="token punctuation">,</span> InternalServerError <span class="token operator">=</span> <span class="token number">500</span> <span class="token punctuation">}</span> <span class="token keyword">namespace</span> HttpStatus <span class="token punctuation">{</span> <span class="token keyword">export</span> <span class="token keyword">function</span> <span class="token function">getDescription</span><span class="token punctuation">(</span>code<span class="token operator">:</span> HttpStatus<span class="token punctuation">)</span><span class="token operator">:</span> <span class="token builtin">string</span> <span class="token punctuation">{</span> <span class="token keyword">switch</span> <span class="token punctuation">(</span>code<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">case</span> HttpStatus<span class="token punctuation">.</span><span class="token constant">OK</span><span class="token operator">:</span> <span class="token keyword">return</span> <span class="token string">"Success"</span><span class="token punctuation">;</span> <span class="token keyword">case</span> HttpStatus<span class="token punctuation">.</span>BadRequest<span class="token operator">:</span> <span class="token keyword">return</span> <span class="token string">"Bad request syntax"</span><span class="token punctuation">;</span> <span class="token keyword">case</span> HttpStatus<span class="token punctuation">.</span>Unauthorized<span class="token operator">:</span> <span class="token keyword">return</span> <span class="token string">"Authentication required"</span><span class="token punctuation">;</span> <span class="token keyword">case</span> HttpStatus<span class="token punctuation">.</span>Forbidden<span class="token operator">:</span> <span class="token keyword">return</span> <span class="token string">"Permission denied"</span><span class="token punctuation">;</span> <span class="token keyword">case</span> HttpStatus<span class="token punctuation">.</span>NotFound<span class="token operator">:</span> <span class="token keyword">return</span> <span class="token string">"Resource not found"</span><span class="token punctuation">;</span> <span class="token keyword">case</span> HttpStatus<span class="token punctuation">.</span>InternalServerError<span class="token operator">:</span> <span class="token keyword">return</span> <span class="token string">"Server error"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">export</span> <span class="token keyword">function</span> <span class="token function">isError</span><span class="token punctuation">(</span>code<span class="token operator">:</span> HttpStatus<span class="token punctuation">)</span><span class="token operator">:</span> <span class="token builtin">boolean</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> code <span class="token operator">>=</span> <span class="token number">400</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">export</span> <span class="token keyword">function</span> <span class="token function">isSuccess</span><span class="token punctuation">(</span>code<span class="token operator">:</span> HttpStatus<span class="token punctuation">)</span><span class="token operator">:</span> <span class="token builtin">boolean</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> code <span class="token operator">>=</span> <span class="token number">200</span> <span class="token operator">&&</span> code <span class="token operator"><</span> <span class="token number">300</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
Part 9: Real-World Case Study – Full Application
Let’s build a comprehensive order management system using enums:
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 |
<span class="token comment">// Step 1: Define our enums</span> <span class="token keyword">enum</span> OrderStatus <span class="token punctuation">{</span> Pending <span class="token operator">=</span> <span class="token string">'PENDING'</span><span class="token punctuation">,</span> PaymentProcessing <span class="token operator">=</span> <span class="token string">'PAYMENT_PROCESSING'</span><span class="token punctuation">,</span> Paid <span class="token operator">=</span> <span class="token string">'PAID'</span><span class="token punctuation">,</span> Preparing <span class="token operator">=</span> <span class="token string">'PREPARING'</span><span class="token punctuation">,</span> Shipped <span class="token operator">=</span> <span class="token string">'SHIPPED'</span><span class="token punctuation">,</span> Delivered <span class="token operator">=</span> <span class="token string">'DELIVERED'</span><span class="token punctuation">,</span> Cancelled <span class="token operator">=</span> <span class="token string">'CANCELLED'</span><span class="token punctuation">,</span> Refunded <span class="token operator">=</span> <span class="token string">'REFUNDED'</span> <span class="token punctuation">}</span> <span class="token keyword">enum</span> PaymentMethod <span class="token punctuation">{</span> CreditCard <span class="token operator">=</span> <span class="token string">'CREDIT_CARD'</span><span class="token punctuation">,</span> DebitCard <span class="token operator">=</span> <span class="token string">'DEBIT_CARD'</span><span class="token punctuation">,</span> PayPal <span class="token operator">=</span> <span class="token string">'PAYPAL'</span><span class="token punctuation">,</span> BankTransfer <span class="token operator">=</span> <span class="token string">'BANK_TRANSFER'</span><span class="token punctuation">,</span> GiftCard <span class="token operator">=</span> <span class="token string">'GIFT_CARD'</span><span class="token punctuation">,</span> Cash <span class="token operator">=</span> <span class="token string">'CASH'</span> <span class="token punctuation">}</span> <span class="token keyword">enum</span> ShippingMethod <span class="token punctuation">{</span> Standard <span class="token operator">=</span> <span class="token string">'STANDARD'</span><span class="token punctuation">,</span> Express <span class="token operator">=</span> <span class="token string">'EXPRESS'</span><span class="token punctuation">,</span> Overnight <span class="token operator">=</span> <span class="token string">'OVERNIGHT'</span><span class="token punctuation">,</span> Pickup <span class="token operator">=</span> <span class="token string">'PICKUP'</span> <span class="token punctuation">}</span> <span class="token keyword">enum</span> UserRole <span class="token punctuation">{</span> Customer <span class="token operator">=</span> <span class="token string">'CUSTOMER'</span><span class="token punctuation">,</span> SalesRep <span class="token operator">=</span> <span class="token string">'SALES_REP'</span><span class="token punctuation">,</span> Warehouse <span class="token operator">=</span> <span class="token string">'WAREHOUSE'</span><span class="token punctuation">,</span> Shipper <span class="token operator">=</span> <span class="token string">'SHIPPER'</span><span class="token punctuation">,</span> Admin <span class="token operator">=</span> <span class="token string">'ADMIN'</span> <span class="token punctuation">}</span> <span class="token comment">// Step 2: Add behavior through namespaces</span> <span class="token keyword">namespace</span> OrderStatus <span class="token punctuation">{</span> <span class="token keyword">export</span> <span class="token keyword">function</span> <span class="token function">isActive</span><span class="token punctuation">(</span>status<span class="token operator">:</span> OrderStatus<span class="token punctuation">)</span><span class="token operator">:</span> <span class="token builtin">boolean</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token punctuation">[</span> OrderStatus<span class="token punctuation">.</span>Pending<span class="token punctuation">,</span> OrderStatus<span class="token punctuation">.</span>PaymentProcessing<span class="token punctuation">,</span> OrderStatus<span class="token punctuation">.</span>Paid<span class="token punctuation">,</span> OrderStatus<span class="token punctuation">.</span>Preparing<span class="token punctuation">,</span> OrderStatus<span class="token punctuation">.</span>Shipped <span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">includes</span><span class="token punctuation">(</span>status<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">export</span> <span class="token keyword">function</span> <span class="token function">isCompleted</span><span class="token punctuation">(</span>status<span class="token operator">:</span> OrderStatus<span class="token punctuation">)</span><span class="token operator">:</span> <span class="token builtin">boolean</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token punctuation">[</span> OrderStatus<span class="token punctuation">.</span>Delivered<span class="token punctuation">,</span> OrderStatus<span class="token punctuation">.</span>Cancelled<span class="token punctuation">,</span> OrderStatus<span class="token punctuation">.</span>Refunded <span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">includes</span><span class="token punctuation">(</span>status<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">export</span> <span class="token keyword">function</span> <span class="token function">canCancel</span><span class="token punctuation">(</span>status<span class="token operator">:</span> OrderStatus<span class="token punctuation">)</span><span class="token operator">:</span> <span class="token builtin">boolean</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token punctuation">[</span> OrderStatus<span class="token punctuation">.</span>Pending<span class="token punctuation">,</span> OrderStatus<span class="token punctuation">.</span>PaymentProcessing<span class="token punctuation">,</span> OrderStatus<span class="token punctuation">.</span>Paid<span class="token punctuation">,</span> OrderStatus<span class="token punctuation">.</span>Preparing <span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">includes</span><span class="token punctuation">(</span>status<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">export</span> <span class="token keyword">function</span> <span class="token function">getNextStatus</span><span class="token punctuation">(</span>current<span class="token operator">:</span> OrderStatus<span class="token punctuation">)</span><span class="token operator">:</span> OrderStatus<span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token punctuation">{</span> <span class="token keyword">switch</span> <span class="token punctuation">(</span>current<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">case</span> OrderStatus<span class="token punctuation">.</span>Pending<span class="token operator">:</span> <span class="token keyword">return</span> <span class="token punctuation">[</span>OrderStatus<span class="token punctuation">.</span>PaymentProcessing<span class="token punctuation">,</span> OrderStatus<span class="token punctuation">.</span>Cancelled<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">case</span> OrderStatus<span class="token punctuation">.</span>PaymentProcessing<span class="token operator">:</span> <span class="token keyword">return</span> <span class="token punctuation">[</span>OrderStatus<span class="token punctuation">.</span>Paid<span class="token punctuation">,</span> OrderStatus<span class="token punctuation">.</span>Cancelled<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">case</span> OrderStatus<span class="token punctuation">.</span>Paid<span class="token operator">:</span> <span class="token keyword">return</span> <span class="token punctuation">[</span>OrderStatus<span class="token punctuation">.</span>Preparing<span class="token punctuation">,</span> OrderStatus<span class="token punctuation">.</span>Refunded<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">case</span> OrderStatus<span class="token punctuation">.</span>Preparing<span class="token operator">:</span> <span class="token keyword">return</span> <span class="token punctuation">[</span>OrderStatus<span class="token punctuation">.</span>Shipped<span class="token punctuation">,</span> OrderStatus<span class="token punctuation">.</span>Cancelled<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">case</span> OrderStatus<span class="token punctuation">.</span>Shipped<span class="token operator">:</span> <span class="token keyword">return</span> <span class="token punctuation">[</span>OrderStatus<span class="token punctuation">.</span>Delivered<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">default</span><span class="token operator">:</span> <span class="token keyword">return</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">namespace</span> PaymentMethod <span class="token punctuation">{</span> <span class="token keyword">export</span> <span class="token keyword">function</span> <span class="token function">requiresProcessing</span><span class="token punctuation">(</span>method<span class="token operator">:</span> PaymentMethod<span class="token punctuation">)</span><span class="token operator">:</span> <span class="token builtin">boolean</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token punctuation">[</span> PaymentMethod<span class="token punctuation">.</span>CreditCard<span class="token punctuation">,</span> PaymentMethod<span class="token punctuation">.</span>DebitCard<span class="token punctuation">,</span> PaymentMethod<span class="token punctuation">.</span>PayPal<span class="token punctuation">,</span> PaymentMethod<span class="token punctuation">.</span>BankTransfer <span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">includes</span><span class="token punctuation">(</span>method<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">export</span> <span class="token keyword">function</span> <span class="token function">isElectronic</span><span class="token punctuation">(</span>method<span class="token operator">:</span> PaymentMethod<span class="token punctuation">)</span><span class="token operator">:</span> <span class="token builtin">boolean</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> method <span class="token operator">!==</span> PaymentMethod<span class="token punctuation">.</span>Cash <span class="token operator">&&</span> method <span class="token operator">!==</span> PaymentMethod<span class="token punctuation">.</span>GiftCard<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">namespace</span> UserRole <span class="token punctuation">{</span> <span class="token keyword">export</span> <span class="token keyword">function</span> <span class="token function">canProcessOrders</span><span class="token punctuation">(</span>role<span class="token operator">:</span> UserRole<span class="token punctuation">)</span><span class="token operator">:</span> <span class="token builtin">boolean</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token punctuation">[</span>UserRole<span class="token punctuation">.</span>SalesRep<span class="token punctuation">,</span> UserRole<span class="token punctuation">.</span>Warehouse<span class="token punctuation">,</span> UserRole<span class="token punctuation">.</span>Admin<span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">includes</span><span class="token punctuation">(</span>role<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">export</span> <span class="token keyword">function</span> <span class="token function">canRefundOrders</span><span class="token punctuation">(</span>role<span class="token operator">:</span> UserRole<span class="token punctuation">)</span><span class="token operator">:</span> <span class="token builtin">boolean</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token punctuation">[</span>UserRole<span class="token punctuation">.</span>SalesRep<span class="token punctuation">,</span> UserRole<span class="token punctuation">.</span>Admin<span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">includes</span><span class="token punctuation">(</span>role<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">export</span> <span class="token keyword">function</span> <span class="token function">canManageUsers</span><span class="token punctuation">(</span>role<span class="token operator">:</span> UserRole<span class="token punctuation">)</span><span class="token operator">:</span> <span class="token builtin">boolean</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> role <span class="token operator">===</span> UserRole<span class="token punctuation">.</span>Admin<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token comment">// Step 3: Use enums in our domain models</span> <span class="token keyword">interface</span> <span class="token class-name">Order</span> <span class="token punctuation">{</span> id<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span> customerId<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span> status<span class="token operator">:</span> OrderStatus<span class="token punctuation">;</span> paymentMethod<span class="token operator">:</span> PaymentMethod<span class="token punctuation">;</span> shippingMethod<span class="token operator">:</span> ShippingMethod<span class="token punctuation">;</span> items<span class="token operator">:</span> OrderItem<span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span> total<span class="token operator">:</span> Money<span class="token punctuation">;</span> createdAt<span class="token operator">:</span> Date<span class="token punctuation">;</span> updatedAt<span class="token operator">:</span> Date<span class="token punctuation">;</span> processedBy<span class="token operator">?</span><span class="token operator">:</span> UserRole<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">interface</span> <span class="token class-name">OrderItem</span> <span class="token punctuation">{</span> productId<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span> quantity<span class="token operator">:</span> <span class="token builtin">number</span><span class="token punctuation">;</span> price<span class="token operator">:</span> Money<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">interface</span> <span class="token class-name">Money</span> <span class="token punctuation">{</span> amount<span class="token operator">:</span> <span class="token builtin">number</span><span class="token punctuation">;</span> currency<span class="token operator">:</span> <span class="token string">'USD'</span> <span class="token operator">|</span> <span class="token string">'EUR'</span> <span class="token operator">|</span> <span class="token string">'GBP'</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// Step 4: Implement services with enum-based logic</span> <span class="token keyword">class</span> <span class="token class-name">OrderService</span> <span class="token punctuation">{</span> <span class="token keyword">private</span> orders<span class="token operator">:</span> Map<span class="token operator"><</span><span class="token builtin">string</span><span class="token punctuation">,</span> Order<span class="token operator">></span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Map</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">async</span> <span class="token function">createOrder</span><span class="token punctuation">(</span>orderData<span class="token operator">:</span> Omit<span class="token operator"><</span>Order<span class="token punctuation">,</span> <span class="token string">'id'</span> <span class="token operator">|</span> <span class="token string">'status'</span> <span class="token operator">|</span> <span class="token string">'createdAt'</span> <span class="token operator">|</span> <span class="token string">'updatedAt'</span><span class="token operator">></span><span class="token punctuation">)</span><span class="token operator">:</span> <span class="token builtin">Promise</span><span class="token operator"><</span>Order<span class="token operator">></span> <span class="token punctuation">{</span> <span class="token keyword">const</span> order<span class="token operator">:</span> Order <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token operator">...</span>orderData<span class="token punctuation">,</span> id<span class="token operator">:</span> <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">generateId</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> status<span class="token operator">:</span> OrderStatus<span class="token punctuation">.</span>Pending<span class="token punctuation">,</span> createdAt<span class="token operator">:</span> <span class="token keyword">new</span> <span class="token class-name">Date</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> updatedAt<span class="token operator">:</span> <span class="token keyword">new</span> <span class="token class-name">Date</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token keyword">this</span><span class="token punctuation">.</span>orders<span class="token punctuation">.</span><span class="token function">set</span><span class="token punctuation">(</span>order<span class="token punctuation">.</span>id<span class="token punctuation">,</span> order<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Automatically start payment processing for electronic payments</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>PaymentMethod<span class="token punctuation">.</span><span class="token function">requiresProcessing</span><span class="token punctuation">(</span>order<span class="token punctuation">.</span>paymentMethod<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">await</span> <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">processPayment</span><span class="token punctuation">(</span>order<span class="token punctuation">.</span>id<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> order<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">async</span> <span class="token function">processPayment</span><span class="token punctuation">(</span>orderId<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">)</span><span class="token operator">:</span> <span class="token builtin">Promise</span><span class="token operator"><</span>Order<span class="token operator">></span> <span class="token punctuation">{</span> <span class="token keyword">const</span> order <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>orders<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>orderId<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>order<span class="token punctuation">)</span> <span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">Error</span><span class="token punctuation">(</span><span class="token string">'Order not found'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>order<span class="token punctuation">.</span>status <span class="token operator">!==</span> OrderStatus<span class="token punctuation">.</span>Pending<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">Error</span><span class="token punctuation">(</span><span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string">Cannot process payment for order in </span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>order<span class="token punctuation">.</span>status<span class="token interpolation-punctuation punctuation">}</span></span><span class="token string"> status</span><span class="token template-punctuation string">`</span></span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> order<span class="token punctuation">.</span>status <span class="token operator">=</span> OrderStatus<span class="token punctuation">.</span>PaymentProcessing<span class="token punctuation">;</span> order<span class="token punctuation">.</span>updatedAt <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Date</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Simulate payment processing</span> <span class="token function">setTimeout</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">completePayment</span><span class="token punctuation">(</span>orderId<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token number">2000</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> order<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">private</span> <span class="token keyword">async</span> <span class="token function">completePayment</span><span class="token punctuation">(</span>orderId<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">)</span><span class="token operator">:</span> <span class="token builtin">Promise</span><span class="token operator"><</span>Order<span class="token operator">></span> <span class="token punctuation">{</span> <span class="token keyword">const</span> order <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>orders<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>orderId<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>order<span class="token punctuation">)</span> <span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">Error</span><span class="token punctuation">(</span><span class="token string">'Order not found'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> order<span class="token punctuation">.</span>status <span class="token operator">=</span> OrderStatus<span class="token punctuation">.</span>Paid<span class="token punctuation">;</span> order<span class="token punctuation">.</span>updatedAt <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Date</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> order<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">async</span> <span class="token function">cancelOrder</span><span class="token punctuation">(</span>orderId<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">,</span> role<span class="token operator">:</span> UserRole<span class="token punctuation">)</span><span class="token operator">:</span> <span class="token builtin">Promise</span><span class="token operator"><</span>Order<span class="token operator">></span> <span class="token punctuation">{</span> <span class="token keyword">const</span> order <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>orders<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>orderId<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>order<span class="token punctuation">)</span> <span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">Error</span><span class="token punctuation">(</span><span class="token string">'Order not found'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>OrderStatus<span class="token punctuation">.</span><span class="token function">canCancel</span><span class="token punctuation">(</span>order<span class="token punctuation">.</span>status<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">Error</span><span class="token punctuation">(</span><span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string">Cannot cancel order in </span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>order<span class="token punctuation">.</span>status<span class="token interpolation-punctuation punctuation">}</span></span><span class="token string"> status</span><span class="token template-punctuation string">`</span></span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>UserRole<span class="token punctuation">.</span><span class="token function">canProcessOrders</span><span class="token punctuation">(</span>role<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">Error</span><span class="token punctuation">(</span><span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string">User role </span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>role<span class="token interpolation-punctuation punctuation">}</span></span><span class="token string"> cannot cancel orders</span><span class="token template-punctuation string">`</span></span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> order<span class="token punctuation">.</span>status <span class="token operator">=</span> OrderStatus<span class="token punctuation">.</span>Cancelled<span class="token punctuation">;</span> order<span class="token punctuation">.</span>updatedAt <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Date</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> order<span class="token punctuation">.</span>processedBy <span class="token operator">=</span> role<span class="token punctuation">;</span> <span class="token comment">// Process refund if payment was made</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>order<span class="token punctuation">.</span>status <span class="token operator">===</span> OrderStatus<span class="token punctuation">.</span>Paid<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">await</span> <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">refundOrder</span><span class="token punctuation">(</span>orderId<span class="token punctuation">,</span> role<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> order<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">private</span> <span class="token keyword">async</span> <span class="token function">refundOrder</span><span class="token punctuation">(</span>orderId<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">,</span> role<span class="token operator">:</span> UserRole<span class="token punctuation">)</span><span class="token operator">:</span> <span class="token builtin">Promise</span><span class="token operator"><</span>Order<span class="token operator">></span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>UserRole<span class="token punctuation">.</span><span class="token function">canRefundOrders</span><span class="token punctuation">(</span>role<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">Error</span><span class="token punctuation">(</span><span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string">User role </span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>role<span class="token interpolation-punctuation punctuation">}</span></span><span class="token string"> cannot process refunds</span><span class="token template-punctuation string">`</span></span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">const</span> order <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>orders<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>orderId<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>order<span class="token punctuation">)</span> <span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">Error</span><span class="token punctuation">(</span><span class="token string">'Order not found'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> order<span class="token punctuation">.</span>status <span class="token operator">=</span> OrderStatus<span class="token punctuation">.</span>Refunded<span class="token punctuation">;</span> order<span class="token punctuation">.</span>updatedAt <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Date</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> order<span class="token punctuation">.</span>processedBy <span class="token operator">=</span> role<span class="token punctuation">;</span> <span class="token keyword">return</span> order<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">async</span> <span class="token function">shipOrder</span><span class="token punctuation">(</span>orderId<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">,</span> method<span class="token operator">:</span> ShippingMethod<span class="token punctuation">)</span><span class="token operator">:</span> <span class="token builtin">Promise</span><span class="token operator"><</span>Order<span class="token operator">></span> <span class="token punctuation">{</span> <span class="token keyword">const</span> order <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>orders<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>orderId<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>order<span class="token punctuation">)</span> <span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">Error</span><span class="token punctuation">(</span><span class="token string">'Order not found'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>order<span class="token punctuation">.</span>status <span class="token operator">!==</span> OrderStatus<span class="token punctuation">.</span>Preparing<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">Error</span><span class="token punctuation">(</span><span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string">Cannot ship order in </span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>order<span class="token punctuation">.</span>status<span class="token interpolation-punctuation punctuation">}</span></span><span class="token string"> status</span><span class="token template-punctuation string">`</span></span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> order<span class="token punctuation">.</span>status <span class="token operator">=</span> OrderStatus<span class="token punctuation">.</span>Shipped<span class="token punctuation">;</span> order<span class="token punctuation">.</span>shippingMethod <span class="token operator">=</span> method<span class="token punctuation">;</span> order<span class="token punctuation">.</span>updatedAt <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Date</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> order<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function">getOrdersByStatus</span><span class="token punctuation">(</span>status<span class="token operator">:</span> OrderStatus<span class="token punctuation">)</span><span class="token operator">:</span> Order<span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token builtin">Array</span><span class="token punctuation">.</span><span class="token function">from</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>orders<span class="token punctuation">.</span><span class="token function">values</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">.</span><span class="token function">filter</span><span class="token punctuation">(</span>order <span class="token operator">=></span> order<span class="token punctuation">.</span>status <span class="token operator">===</span> status<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function">getOrderStatistics</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">:</span> Record<span class="token operator"><</span>OrderStatus<span class="token punctuation">,</span> <span class="token builtin">number</span><span class="token operator">></span> <span class="token punctuation">{</span> <span class="token keyword">const</span> stats <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token punctuation">}</span> <span class="token keyword">as</span> Record<span class="token operator"><</span>OrderStatus<span class="token punctuation">,</span> <span class="token builtin">number</span><span class="token operator">></span><span class="token punctuation">;</span> Object<span class="token punctuation">.</span><span class="token function">values</span><span class="token punctuation">(</span>OrderStatus<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">forEach</span><span class="token punctuation">(</span>status <span class="token operator">=></span> <span class="token punctuation">{</span> stats<span class="token punctuation">[</span>status<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">getOrdersByStatus</span><span class="token punctuation">(</span>status<span class="token punctuation">)</span><span class="token punctuation">.</span>length<span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> stats<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">private</span> <span class="token function">generateId</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">:</span> <span class="token builtin">string</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> Math<span class="token punctuation">.</span><span class="token function">random</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">(</span><span class="token number">36</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">substring</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">15</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token comment">// Step 5: Use enums in UI components</span> <span class="token keyword">class</span> <span class="token class-name">OrderDashboard</span> <span class="token punctuation">{</span> <span class="token keyword">private</span> orderService <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">OrderService</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">renderStatusBadge</span><span class="token punctuation">(</span>status<span class="token operator">:</span> OrderStatus<span class="token punctuation">)</span><span class="token operator">:</span> <span class="token builtin">string</span> <span class="token punctuation">{</span> <span class="token keyword">const</span> baseClass <span class="token operator">=</span> <span class="token string">'status-badge'</span><span class="token punctuation">;</span> <span class="token keyword">const</span> statusClass <span class="token operator">=</span> status<span class="token punctuation">.</span><span class="token function">toLowerCase</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">const</span> icon <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">getStatusIcon</span><span class="token punctuation">(</span>status<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string"><span class="</span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>baseClass<span class="token interpolation-punctuation punctuation">}</span></span> <span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>statusClass<span class="token interpolation-punctuation punctuation">}</span></span><span class="token string">"></span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>icon<span class="token interpolation-punctuation punctuation">}</span></span> <span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>status<span class="token interpolation-punctuation punctuation">}</span></span><span class="token string"></span></span><span class="token template-punctuation string">`</span></span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">private</span> <span class="token function">getStatusIcon</span><span class="token punctuation">(</span>status<span class="token operator">:</span> OrderStatus<span class="token punctuation">)</span><span class="token operator">:</span> <span class="token builtin">string</span> <span class="token punctuation">{</span> <span class="token keyword">switch</span> <span class="token punctuation">(</span>status<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">case</span> OrderStatus<span class="token punctuation">.</span>Pending<span class="token operator">:</span> <span class="token keyword">return</span> <span class="token string">'⏳'</span><span class="token punctuation">;</span> <span class="token keyword">case</span> OrderStatus<span class="token punctuation">.</span>PaymentProcessing<span class="token operator">:</span> <span class="token keyword">return</span> <span class="token string">'💳'</span><span class="token punctuation">;</span> <span class="token keyword">case</span> OrderStatus<span class="token punctuation">.</span>Paid<span class="token operator">:</span> <span class="token keyword">return</span> <span class="token string">'✅'</span><span class="token punctuation">;</span> <span class="token keyword">case</span> OrderStatus<span class="token punctuation">.</span>Preparing<span class="token operator">:</span> <span class="token keyword">return</span> <span class="token string">'📦'</span><span class="token punctuation">;</span> <span class="token keyword">case</span> OrderStatus<span class="token punctuation">.</span>Shipped<span class="token operator">:</span> <span class="token keyword">return</span> <span class="token string">'🚚'</span><span class="token punctuation">;</span> <span class="token keyword">case</span> OrderStatus<span class="token punctuation">.</span>Delivered<span class="token operator">:</span> <span class="token keyword">return</span> <span class="token string">'🏁'</span><span class="token punctuation">;</span> <span class="token keyword">case</span> OrderStatus<span class="token punctuation">.</span>Cancelled<span class="token operator">:</span> <span class="token keyword">return</span> <span class="token string">'❌'</span><span class="token punctuation">;</span> <span class="token keyword">case</span> OrderStatus<span class="token punctuation">.</span>Refunded<span class="token operator">:</span> <span class="token keyword">return</span> <span class="token string">'💰'</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token function">renderOrderTable</span><span class="token punctuation">(</span>orders<span class="token operator">:</span> Order<span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token operator">:</span> <span class="token builtin">string</span> <span class="token punctuation">{</span> <span class="token keyword">let</span> html <span class="token operator">=</span> <span class="token string">'<table><thead><tr><th>ID</th><th>Status</th><th>Payment</th><th>Shipping</th><th>Actions</th></tr></thead><tbody>'</span><span class="token punctuation">;</span> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">const</span> order <span class="token keyword">of</span> orders<span class="token punctuation">)</span> <span class="token punctuation">{</span> html <span class="token operator">+=</span> <span class="token string">'<tr>'</span><span class="token punctuation">;</span> html <span class="token operator">+=</span> <span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string"><td></span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>order<span class="token punctuation">.</span>id<span class="token interpolation-punctuation punctuation">}</span></span><span class="token string"></td></span><span class="token template-punctuation string">`</span></span><span class="token punctuation">;</span> html <span class="token operator">+=</span> <span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string"><td></span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span><span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">renderStatusBadge</span><span class="token punctuation">(</span>order<span class="token punctuation">.</span>status<span class="token punctuation">)</span><span class="token interpolation-punctuation punctuation">}</span></span><span class="token string"></td></span><span class="token template-punctuation string">`</span></span><span class="token punctuation">;</span> html <span class="token operator">+=</span> <span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string"><td></span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>order<span class="token punctuation">.</span>paymentMethod<span class="token interpolation-punctuation punctuation">}</span></span><span class="token string"></td></span><span class="token template-punctuation string">`</span></span><span class="token punctuation">;</span> html <span class="token operator">+=</span> <span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string"><td></span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>order<span class="token punctuation">.</span>shippingMethod<span class="token interpolation-punctuation punctuation">}</span></span><span class="token string"></td></span><span class="token template-punctuation string">`</span></span><span class="token punctuation">;</span> html <span class="token operator">+=</span> <span class="token string">'<td>'</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>OrderStatus<span class="token punctuation">.</span><span class="token function">canCancel</span><span class="token punctuation">(</span>order<span class="token punctuation">.</span>status<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> html <span class="token operator">+=</span> <span class="token string">'<button class="cancel-btn">Cancel</button>'</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>order<span class="token punctuation">.</span>status <span class="token operator">===</span> OrderStatus<span class="token punctuation">.</span>Paid<span class="token punctuation">)</span> <span class="token punctuation">{</span> html <span class="token operator">+=</span> <span class="token string">'<button class="prepare-btn">Prepare</button>'</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>order<span class="token punctuation">.</span>status <span class="token operator">===</span> OrderStatus<span class="token punctuation">.</span>Preparing<span class="token punctuation">)</span> <span class="token punctuation">{</span> html <span class="token operator">+=</span> <span class="token string">'<button class="ship-btn">Ship</button>'</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> html <span class="token operator">+=</span> <span class="token string">'</td>'</span><span class="token punctuation">;</span> html <span class="token operator">+=</span> <span class="token string">'</tr>'</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> html <span class="token operator">+=</span> <span class="token string">'</tbody></table>'</span><span class="token punctuation">;</span> <span class="token keyword">return</span> html<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function">renderStatistics</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">:</span> <span class="token builtin">string</span> <span class="token punctuation">{</span> <span class="token keyword">const</span> stats <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>orderService<span class="token punctuation">.</span><span class="token function">getOrderStatistics</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">let</span> html <span class="token operator">=</span> <span class="token string">'<div class="stats-grid">'</span><span class="token punctuation">;</span> Object<span class="token punctuation">.</span><span class="token function">entries</span><span class="token punctuation">(</span>stats<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">forEach</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">[</span>status<span class="token punctuation">,</span> count<span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token keyword">const</span> isActive <span class="token operator">=</span> OrderStatus<span class="token punctuation">.</span><span class="token function">isActive</span><span class="token punctuation">(</span>status <span class="token keyword">as</span> OrderStatus<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">const</span> isCompleted <span class="token operator">=</span> OrderStatus<span class="token punctuation">.</span><span class="token function">isCompleted</span><span class="token punctuation">(</span>status <span class="token keyword">as</span> OrderStatus<span class="token punctuation">)</span><span class="token punctuation">;</span> html <span class="token operator">+=</span> <span class="token template-string"><span class="token template-punctuation string">`</span></span> <div class="stat-card <span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>isActive <span class="token operator">?</span> <span class="token string">'active'</span> <span class="token operator">:</span> <span class="token string">''</span><span class="token interpolation-punctuation punctuation">}</span></span> <span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>isCompleted <span class="token operator">?</span> <span class="token string">'completed'</span> <span class="token operator">:</span> <span class="token string">''</span><span class="token interpolation-punctuation punctuation">}</span></span><span class="token string">"></span> <h3><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>status<span class="token interpolation-punctuation punctuation">}</span></span><span class="token string"></h3></span> <div class="count"><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>count<span class="token interpolation-punctuation punctuation">}</span></span><span class="token string"></div></span> </div> <span class="token template-punctuation string">`</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> html <span class="token operator">+=</span> <span class="token string">'</div>'</span><span class="token punctuation">;</span> <span class="token keyword">return</span> html<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token comment">// Step 6: API layer with enum validation</span> <span class="token keyword">class</span> <span class="token class-name">OrderController</span> <span class="token punctuation">{</span> <span class="token keyword">private</span> orderService <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">OrderService</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">async</span> <span class="token function">createOrder</span><span class="token punctuation">(</span>req<span class="token operator">:</span> <span class="token builtin">any</span><span class="token punctuation">,</span> res<span class="token operator">:</span> <span class="token builtin">any</span><span class="token punctuation">)</span><span class="token operator">:</span> <span class="token builtin">Promise</span><span class="token operator"><</span><span class="token keyword">void</span><span class="token operator">></span> <span class="token punctuation">{</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> <span class="token comment">// Validate payment method</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>Object<span class="token punctuation">.</span><span class="token function">values</span><span class="token punctuation">(</span>PaymentMethod<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">includes</span><span class="token punctuation">(</span>req<span class="token punctuation">.</span>body<span class="token punctuation">.</span>paymentMethod<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> res<span class="token punctuation">.</span><span class="token function">status</span><span class="token punctuation">(</span><span class="token number">400</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">json</span><span class="token punctuation">(</span><span class="token punctuation">{</span> error<span class="token operator">:</span> <span class="token string">'Invalid payment method'</span><span class="token punctuation">,</span> validMethods<span class="token operator">:</span> Object<span class="token punctuation">.</span><span class="token function">values</span><span class="token punctuation">(</span>PaymentMethod<span class="token punctuation">)</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// Validate shipping method</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>Object<span class="token punctuation">.</span><span class="token function">values</span><span class="token punctuation">(</span>ShippingMethod<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">includes</span><span class="token punctuation">(</span>req<span class="token punctuation">.</span>body<span class="token punctuation">.</span>shippingMethod<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> res<span class="token punctuation">.</span><span class="token function">status</span><span class="token punctuation">(</span><span class="token number">400</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">json</span><span class="token punctuation">(</span><span class="token punctuation">{</span> error<span class="token operator">:</span> <span class="token string">'Invalid shipping method'</span><span class="token punctuation">,</span> validMethods<span class="token operator">:</span> Object<span class="token punctuation">.</span><span class="token function">values</span><span class="token punctuation">(</span>ShippingMethod<span class="token punctuation">)</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">const</span> order <span class="token operator">=</span> <span class="token keyword">await</span> <span class="token keyword">this</span><span class="token punctuation">.</span>orderService<span class="token punctuation">.</span><span class="token function">createOrder</span><span class="token punctuation">(</span>req<span class="token punctuation">.</span>body<span class="token punctuation">)</span><span class="token punctuation">;</span> res<span class="token punctuation">.</span><span class="token function">status</span><span class="token punctuation">(</span><span class="token number">201</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">json</span><span class="token punctuation">(</span>order<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span>error<span class="token punctuation">)</span> <span class="token punctuation">{</span> res<span class="token punctuation">.</span><span class="token function">status</span><span class="token punctuation">(</span><span class="token number">500</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">json</span><span class="token punctuation">(</span><span class="token punctuation">{</span> error<span class="token operator">:</span> error<span class="token punctuation">.</span>message <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">async</span> <span class="token function">updateOrderStatus</span><span class="token punctuation">(</span>req<span class="token operator">:</span> <span class="token builtin">any</span><span class="token punctuation">,</span> res<span class="token operator">:</span> <span class="token builtin">any</span><span class="token punctuation">)</span><span class="token operator">:</span> <span class="token builtin">Promise</span><span class="token operator"><</span><span class="token keyword">void</span><span class="token operator">></span> <span class="token punctuation">{</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> <span class="token keyword">const</span> <span class="token punctuation">{</span> orderId <span class="token punctuation">}</span> <span class="token operator">=</span> req<span class="token punctuation">.</span>params<span class="token punctuation">;</span> <span class="token keyword">const</span> <span class="token punctuation">{</span> status<span class="token punctuation">,</span> role <span class="token punctuation">}</span> <span class="token operator">=</span> req<span class="token punctuation">.</span>body<span class="token punctuation">;</span> <span class="token comment">// Validate status</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>Object<span class="token punctuation">.</span><span class="token function">values</span><span class="token punctuation">(</span>OrderStatus<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">includes</span><span class="token punctuation">(</span>status<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> res<span class="token punctuation">.</span><span class="token function">status</span><span class="token punctuation">(</span><span class="token number">400</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">json</span><span class="token punctuation">(</span><span class="token punctuation">{</span> error<span class="token operator">:</span> <span class="token string">'Invalid order status'</span><span class="token punctuation">,</span> validStatuses<span class="token operator">:</span> Object<span class="token punctuation">.</span><span class="token function">values</span><span class="token punctuation">(</span>OrderStatus<span class="token punctuation">)</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// Validate user role</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>Object<span class="token punctuation">.</span><span class="token function">values</span><span class="token punctuation">(</span>UserRole<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">includes</span><span class="token punctuation">(</span>role<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> res<span class="token punctuation">.</span><span class="token function">status</span><span class="token punctuation">(</span><span class="token number">400</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">json</span><span class="token punctuation">(</span><span class="token punctuation">{</span> error<span class="token operator">:</span> <span class="token string">'Invalid user role'</span><span class="token punctuation">,</span> validRoles<span class="token operator">:</span> Object<span class="token punctuation">.</span><span class="token function">values</span><span class="token punctuation">(</span>UserRole<span class="token punctuation">)</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">let</span> order<span class="token punctuation">;</span> <span class="token keyword">switch</span> <span class="token punctuation">(</span>status<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">case</span> OrderStatus<span class="token punctuation">.</span>Cancelled<span class="token operator">:</span> order <span class="token operator">=</span> <span class="token keyword">await</span> <span class="token keyword">this</span><span class="token punctuation">.</span>orderService<span class="token punctuation">.</span><span class="token function">cancelOrder</span><span class="token punctuation">(</span>orderId<span class="token punctuation">,</span> role<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">break</span><span class="token punctuation">;</span> <span class="token keyword">case</span> OrderStatus<span class="token punctuation">.</span>Shipped<span class="token operator">:</span> order <span class="token operator">=</span> <span class="token keyword">await</span> <span class="token keyword">this</span><span class="token punctuation">.</span>orderService<span class="token punctuation">.</span><span class="token function">shipOrder</span><span class="token punctuation">(</span>orderId<span class="token punctuation">,</span> req<span class="token punctuation">.</span>body<span class="token punctuation">.</span>shippingMethod<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">break</span><span class="token punctuation">;</span> <span class="token keyword">default</span><span class="token operator">:</span> res<span class="token punctuation">.</span><span class="token function">status</span><span class="token punctuation">(</span><span class="token number">400</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">json</span><span class="token punctuation">(</span><span class="token punctuation">{</span> error<span class="token operator">:</span> <span class="token string">'Status update not supported'</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> res<span class="token punctuation">.</span><span class="token function">json</span><span class="token punctuation">(</span>order<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span>error<span class="token punctuation">)</span> <span class="token punctuation">{</span> res<span class="token punctuation">.</span><span class="token function">status</span><span class="token punctuation">(</span><span class="token number">500</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">json</span><span class="token punctuation">(</span><span class="token punctuation">{</span> error<span class="token operator">:</span> error<span class="token punctuation">.</span>message <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
Part 10: Enum Best Practices
DO: Use PascalCase for enum names and members
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<span class="token comment">// ✅ Good</span> <span class="token keyword">enum</span> OrderStatus <span class="token punctuation">{</span> Pending<span class="token punctuation">,</span> Approved<span class="token punctuation">,</span> Rejected <span class="token punctuation">}</span> <span class="token comment">// ❌ Bad</span> <span class="token keyword">enum</span> order_status <span class="token punctuation">{</span> pending<span class="token punctuation">,</span> approved<span class="token punctuation">,</span> rejected <span class="token punctuation">}</span> |
DO: Use const enums for performance-critical code
|
0 1 2 3 4 5 6 7 8 9 |
<span class="token comment">// When you need maximum performance</span> <span class="token keyword">const</span> <span class="token keyword">enum</span> Direction <span class="token punctuation">{</span> Up<span class="token punctuation">,</span> Down<span class="token punctuation">,</span> Left<span class="token punctuation">,</span> Right <span class="token punctuation">}</span> |
DON’T: Use heterogeneous enums
|
0 1 2 3 4 5 6 7 8 9 10 |
<span class="token comment">// ❌ Just don't</span> <span class="token keyword">enum</span> Confusion <span class="token punctuation">{</span> Yes <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">,</span> No <span class="token operator">=</span> <span class="token string">"NO"</span> <span class="token punctuation">}</span> |
DO: Use string enums for better debugging
|
0 1 2 3 4 5 6 7 8 9 10 11 12 |
<span class="token comment">// ✅ Much clearer in logs and devtools</span> <span class="token keyword">enum</span> LogLevel <span class="token punctuation">{</span> Debug <span class="token operator">=</span> <span class="token string">"DEBUG"</span><span class="token punctuation">,</span> Info <span class="token operator">=</span> <span class="token string">"INFO"</span><span class="token punctuation">,</span> Warn <span class="token operator">=</span> <span class="token string">"WARN"</span><span class="token punctuation">,</span> Error <span class="token operator">=</span> <span class="token string">"ERROR"</span> <span class="token punctuation">}</span> |
CONSIDER: Union types for simple cases
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 |
<span class="token comment">// For simple, internal-only constants</span> <span class="token keyword">type</span> <span class="token class-name">Status</span> <span class="token operator">=</span> <span class="token string">"pending"</span> <span class="token operator">|</span> <span class="token string">"approved"</span> <span class="token operator">|</span> <span class="token string">"rejected"</span><span class="token punctuation">;</span> <span class="token comment">// Use enum when you need:</span> <span class="token comment">// - Runtime object</span> <span class="token comment">// - Reverse mapping</span> <span class="token comment">// - To add methods via namespace</span> <span class="token comment">// - To share across files/modules</span> |
Part 11: Common Pitfalls and Solutions
Pitfall 1: Reverse Mapping Creates Double Objects
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<span class="token keyword">enum</span> Status <span class="token punctuation">{</span> Pending<span class="token punctuation">,</span> <span class="token comment">// Creates Status.Pending = 0 AND Status[0] = "Pending"</span> <span class="token punctuation">}</span> <span class="token comment">// Results in:</span> <span class="token punctuation">{</span> <span class="token string-property property">"0"</span><span class="token operator">:</span> <span class="token string">"Pending"</span><span class="token punctuation">,</span> <span class="token string-property property">"1"</span><span class="token operator">:</span> <span class="token string">"Approved"</span><span class="token punctuation">,</span> <span class="token string-property property">"Pending"</span><span class="token operator">:</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token string-property property">"Approved"</span><span class="token operator">:</span> <span class="token number">1</span> <span class="token punctuation">}</span> <span class="token comment">// Solution: Use const enum or string enum</span> <span class="token keyword">const</span> <span class="token keyword">enum</span> Status <span class="token punctuation">{</span> Pending<span class="token punctuation">,</span> Approved <span class="token punctuation">}</span> <span class="token comment">// No reverse mapping generated</span> |
Pitfall 2: Type Safety with Numeric Enums
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<span class="token keyword">enum</span> Status <span class="token punctuation">{</span> Pending<span class="token punctuation">,</span> Approved <span class="token punctuation">}</span> <span class="token keyword">let</span> status<span class="token operator">:</span> Status <span class="token operator">=</span> <span class="token number">100</span><span class="token punctuation">;</span> <span class="token comment">// This works! 😱</span> <span class="token comment">// Solution: Use string enums</span> <span class="token keyword">enum</span> Status <span class="token punctuation">{</span> Pending <span class="token operator">=</span> <span class="token string">"PENDING"</span><span class="token punctuation">,</span> Approved <span class="token operator">=</span> <span class="token string">"APPROVED"</span> <span class="token punctuation">}</span> <span class="token keyword">let</span> status<span class="token operator">:</span> Status <span class="token operator">=</span> <span class="token number">100</span><span class="token punctuation">;</span> <span class="token comment">// Error! Type '100' is not assignable to type 'Status'</span> |
Pitfall 3: Const Enums in Declaration Files
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<span class="token comment">// In a .d.ts file</span> <span class="token keyword">declare</span> <span class="token keyword">const</span> <span class="token keyword">enum</span> Color <span class="token punctuation">{</span> Red<span class="token punctuation">,</span> Green<span class="token punctuation">,</span> Blue <span class="token punctuation">}</span> <span class="token comment">// This can cause issues with some compilers</span> <span class="token comment">// Better: Use regular enum in .d.ts files</span> <span class="token keyword">declare</span> <span class="token keyword">enum</span> Color <span class="token punctuation">{</span> Red<span class="token punctuation">,</span> Green<span class="token punctuation">,</span> Blue <span class="token punctuation">}</span> |
Summary: When to Use Enums
USE ENUMS WHEN:
-
You have a fixed set of constants that are related
-
You need both the name and value at runtime
-
You want reverse mapping (numeric enums)
-
You’re defining domain concepts (OrderStatus, PaymentMethod, UserRole)
-
You want to add behavior via namespace merging
CONSIDER ALTERNATIVES WHEN:
-
The set of values might change frequently (use union types)
-
You’re building a library (const enums can cause issues)
-
You need maximum tree-shaking (use const assertions)
-
You’re just defining a few simple constants
Final Thoughts
Enums in TypeScript are like creating a specialized vocabulary for your application. They transform:
-
“What does status 3 mean?” → “This order is shipped”
-
“Is ‘DELETE’ a valid HTTP method?” → “Delete is defined in HttpMethod enum”
-
“Can we cancel an order in this state?” → “Check OrderStatus.canCancel()”
Yes, enums have quirks. Yes, there’s debate about whether to use them. But when used appropriately, they create self-documenting, type-safe, and maintainable code that clearly expresses your domain model.
Remember: The goal isn’t to use enums everywhere. The goal is to use the right tool for the job. Enums are one powerful tool in your TypeScript toolbox – use them when they make your code clearer and safer.
Does this help clarify TypeScript enums? Would you like me to elaborate on any specific aspect or show more examples of enum patterns?
