In this article, you'll learn about what enums are and how you can use them in your projects. Enums, short for Enumerated Types.
This is going to be a full series of typescript where you will learn from basic topics like string, boolean to more complex like Type Aliases, enums, Interface, generics, and etc.
Table of Contents
Enums
Enums are one of the few features TypeScript has which is not a type-level extension of JavaScript.
Enums allow a developer to define a set of named constants. Using enums can make it easier to document intent, or create a set of distinct cases. TypeScript provides both numeric and string-based enums.
Numeric enums
We will first take a look at Numeric enums and how we can create them. An enum can be defined using the enum
keyword.
enum Direction {
Up,
Down,
Left,
Right,
}
Above, we have a numeric enum where Up
is initialized with 0
. All of the following members are auto-incremented from that point on. In other words, Direction.Up
has the value 0
, Down
has 1
, Left
has 2
, and Right
has 3
.
In the Numeric enums, the values are in the incremented order as explained above. You can manipulate these values as you want. Let’s take a few examples of that:
// Up = 1, Down = 2, Left = 3, Right = 4
enum Direction {
Up = 1,
Down,
Left,
Right,
}
// Up = 1, Down = 5, Left = 6, Right = 7
enum Direction {
Up,
Down = 5,
Left,
Right,
}
// Up = 10, Down = 11, Left = 14, Right = 15
enum Direction {
Up = 10,
Down,
Left = 14,
Right,
}
In the above code example, I have updated the values and shown you what will be the value of the others members.
String enums
String enums are a similar concept. In a string enum, each member has to be constant-initialized with a string literal, or with another string enum member.
enum Direction {
Up = "UP",
Down = "DOWN",
Left = "LEFT",
Right = "RIGHT",
}
To access any members you can do the following:
console.log(Direction.Up) // output: UP
Heterogeneous enums
enums
can be mixed with string and numeric members, but it’s not clear why you would ever want to do so. it’s advised that you don’t do this.
enum ExtraFries {
No = 0,
Yes = "YES",
}
If you want to learn more about Enums, consider reading the documentation.
Wrapping up
In this article, I have explained what enums are and how you can use them in your projects. Enums, short for Enumerated Types.
This is a series of Typescript that will help you to learn Typescript from the scratch. If you enjoyed this article, then don't forget to give ❤️ and Bookmark 🏷️for later use and if you have any questions or feedback then don't hesitate to drop them in the comments below. I'll see in the next one.
Connect with me
Top comments (18)
Nice article bro 🔥🔥
Could you give me an example of when I could use an enum instead of an object, please?
Keep going on the series dude!
Objects are re-assignable but you can't assign values to enums types.
But if we use object that it will allows us:
You can check the playground:
typescriptlang.org/play?#code/PTAE...
Thanks bro! 🤝
by appending
as const
to the value ofobj
you even get a read-only version of it, which can not be modified at runtime, and whereobj.no
andobj.yes
have a narrowed type of the string literal value!To even get a type for all the possible values, you can use the following snippet:
of course it might help to have the same casing for both keys and values to simplify your searches.
Putting it all together:
(yes, you can export a type and a value with the same name from a module!)
This still allows you to use literal values everywhere and from what I know if as close as you can get to an enum.
If you need to reference the type of one of the keys from the const, you need to use
typeof YesNo.Yes
. (There are other options but they are longer.)Hope it helps
Thanks mate! It will helps for sure, I was searching for that way of typing
🤝🤝
Helping a lot! 🫀
Please keep continuing the series mate!
Thank you! 🔥🔥
Thanks mate. Definitely.
Really cool and helpful! Thanks!
I am glad you find it useful 😊
Great breakdown :) and thank you for sharing that the Heterogeneous enums are a bad idea! Keep up the good work!
Thanks mate 😊
I loved this post series; it's incredible!
Thanks Heather.
Since I discovered you can use strings as types I just use the following:
I find it actually less confusing than enums?
I wish this article didn't get this much positive feedback - or any at all for that matter.
I see comments like "Really cool and helpful! Thanks!". No, it's the opposite of helpful. It's spreading an anti-pattern. Nothing wrong with talking about what Enums are. But if you do that, you should also talk whether Enums should ever be used in TS. And the answer is - in most cases they should not.
TypeScript Enums are an awkward attempt to make Enums from C# or Java work in JS. They have weird edge-cases and should almost never be used. String literals will achieve the result with better ergonomics in most situations. This is the most important thing anybody need to know about JS Enums.
Don't believe me? Just do a quick google search and see smarter people talk about it.
I can just agree. Enums in TypeScript should be avoided. See also @karfau answer for a better approach.
Great article..
Such a great series of articles. Although I used type script in some of my projects, it helps me simplify, popularize, and understand better some subtleties.
Great job man! Appreciate 🔥