Yesterday, we talked about any
, unknown
, and the pros and cons of using such types.
Today, let’s focus on union types, an alternative to enums that are more performant and flexible to describe custom types. Let’s assume we need to support different currencies in our application. Since currencies are mostly a code/symbol, we could take the easy route and do the following:
But this doesn’t help us much. For example, is any string
a valid currency? Definitely not. So a better option would be to create an enum
for it and describe all possible values in it:
Now we have a proper type to describe what a Currency
is. But enums
aren’t that convenient because they can’t be used as-is in an Angular component template, requiring some workarounds. Also, they get compiled into a monster structure of JavaScript that increases the size of your code bundle for no valid reason since we don’t have type-checking at runtime in the browser.
Enter union types
Union types solve all these problems. They’re lightweight and do not get compiled into anything at all, which means they’re always more performant than enums
(less code to download + less code to interpret = faster app in the browser). They guarantee type safety and can be made out of anything, including strings:
A lot more can be done with union types, such as having more options than just one single type for a given variable:
Angular uses union types a lot. For instance, if you’ve ever used the canActivate router guard, its signature supports up to 6 different return types, all defined with union types:
And we can have unions of union types when more granularity is needed with specific sub-types: