enum
Generally recommended to avoid enum and just use plain Object.freeze() method
When something is a symbol, define it as enum
, not as a magic string
enum
over union
type when the list of options is growing and the reference to the values are referenced in multiple locationsenum
There are frequent recommendations to use as const
. However, this doesn't guarantee the immutability. It's just a syntactic sugar that assumes object is immutable or manipulated.
Instead, you can represent enum
with Object.freeze()
.
Object.freeze()
const availableOptionsForClientFilter: OptionTypes[] = [ { label: "First Option", value: FilterOptions.OptionOne, }, { label: "Second Option", value: FilterOptions.OptionTwo, }, ]; Object.freeze(availableOptions);
See more details under section:
Object.freeze
vs as const
Convention is to capitalize enum
options variable names
enum FilterOptions { OptionOne = "Option 1", OptionTwo = "Option 2", OptionThree = "Option 3", OptionInvalid = "Invalid", OptionUndefined = "Undefined", } // Array of `enum` entries const enumAsArrayOfEntries: { key: string; value: string; }[] = Object.entries(FilterOptions).map( ([key, value]) => ({key, value}) ); /* [ { "key": "OptionOne", "value": "Option 1" }, { "key": "OptionTwo", "value": "Option 2" }, ... ] */ const keysOfEntries: string[] = Object.entries(FilterOptions).map( ([key, value]) => (key) ); // ["OptionOne", "OptionTwo", "OptionThree", "OptionInvalid", "OptionUndefined"] const valuesOfEntries: string[] = Object.entries(FilterOptions).map( ([key, value]) => (value) ); // ["Option 1", "Option 2", "Option 3", "Invalid", "Undefined"]
Up is initialized with 1
Up
has the value 1
Down
has 2
Left
has 3
Right
has 4
enum Direction { Up = 1, Down, Left, Right, }
Example: Returning a concatenation of lookup values and available type options
export enum ResistorValues { black = 0, brown = 1, red = 2, orange = 3, yellow = 4, green = 5, blue = 6, violet = 7, grey = 8, white = 9, } type Color = keyof typeof ResistorValues; export function decodedValue([first, second]: Color[]): number { return Number(`${ResistorValues[first]}${ResistorValues[second]}`) }
const OptionObj = { OptionOne: "Option 1", OptionTwo: "Option 2", OptionThree: "Option 3", OptionInvalid: "Invalid", OptionUndefined: "Undefined", } as const; type OptionTypes = typeof OptionObj[keyof typeof OptionObj];
enum
vs union
Unions
are a compile time
concept while enums
are transpiled and end up in resulting Javascript.
You can also enumerate over enums
.
type TT = "A" | "B" | "С"; function doSomethingWithUnion(p: TT) { // ... } doSomethingWithUnion("A"); // equivalent in JS "use strict"; function doSomethingWithUnion(p) { // ... } doSomethingWithUnion("A"); var EE; (function (EE) { EE[EE["A"] = 0] = "A"; EE[EE["B"] = 1] = "B"; EE[EE["C"] = 2] = "C"; })(EE || (EE = {}));
enum EE { A, B, C } function doSomethingWithEnum(p: EE) { // ... } doSomethingWithEnum(EE.A); // equivalent in js function doSomethingWithEnum(p) { // ... } doSomethingWithEnum(EE.A);