TypeScript is not just about validation, It's also about structure and today, let's talk about using ENUMS to save your team unnecessary hours of debugging.
In enterprise software development, we often use Typescript to ensure our data is consistent.
But aside from using any
to deceive ourselves (not the machine), we also ignore the importance of ENUMS.
Here is a scenario:
Your company is developing a food delivery software and you have 3 type of users who can sign up as demonstrated in the snippet below.
Someone in your team used Vendor
, another person used vendor
, you used VENDOR
That's a simple bug that can waste hours of productivity.
Solution:
Use ENUM to define the structure of your user Role. ENUM is readonly and very strict, it'll get your team members in order.
Code snippets
// Do ✅️
enum Role {
Vendor = "VENDOR",
Customer = "CUSTOMER",
Rider = "RIDER"
}
const userRole: Role = Role.Admin;
// Don't ❌️
const userRole = "VENDOR"; // Very badd
// learn moteat www.stephengade.com
Top comments (14)
I like using enums too for objects.
TS-team however, recommends we use objects instead, like:
enums have some type-safety issues: dev.to/ivanzm123/dont-use-enums-in...
This is a good take
No, use string unions instead.
Enums introduce a runtime construct and typescript should only be a compile-time tool.
Unions gives you all the type safety and -- for libraries -- works for JavaScript (i.e. non typescript) projects flawlessly.
I get what you mean, but what you say is wrong: It is a compile-time tool, or better stated, a transpilation tool since JS is not compiled by today's tools. Today's tools transpile, bundle and minify, but don't compile.
What you meant to say is that TS should not "write extra code", or at least this is what I think you meant. If I'm correct, that's also wrong: TypeScript, depending on the target version of ECMAScript, will generate code accordingly. By design, TS is meant to support as much as possible all the newest syntax ahead of time, and is ready to shim on the fly.
Finally, there is no absolute "best" enum. String unions are nice, but numeric enums are great:
Came here to say this
Enums in typescript are not great. Most of the time when you're thinking about using enums, try using string literal instead:
This provides same level of type safety, same intellisence, but less verbose and easier to use
I would do it so
Enums are horrible, considering the alternatives that typescript provides
Aside from the other issues mentioned, it's often very useful to use an object to store additional metadata that may be needed when using the options. You can use
keyof typeof
to extract the keys into a type (string union) to be used throughout your code.For example:
I used to use enum last time, but there were some issues that I faced.
Since then have been using plain object
Sometimes it's better to use Types for this kind of stuff because enums generate a lot of unnecessary transpired code (not a big issue if you don't have too many, tho) and because types will more easily resonate with people still using strings for this kind of stuff. It's still forcing everyone to use the correct string too.
If there would be easy fix for this in JS 🤔
Otherwise I tend to agree that enums are obsolete
typescriptlang.org/play/?#code/KYO...
Enums is almost an useless feature in TS and you hardly wrote about it
Enums are bad in ts they were not made for ts they are not even type safe the better alternative would be to use objects or union types