TypeScript Enums

Numeric enums

1
2
3
4
5
6
7
8
9
10
11
12
enum Direction {
UP,
DOWN,
LEFT,
RIGHT,
}

function move(length: number, direction: Direction): void {
console.log(`move: ${direction} ${length}meters.`)
}

move(10, Direction.UP)

String enums

1
2
3
4
5
6
enum Direction {
UP = "UP",
DOWN = "DOWN",
LEFT = "LEFT",
RIGHT = "RIGHT",
}

Heterogeneous enums

1
2
3
4
enum E {
yes,
no = "no",
}

Computed members

1
2
3
4
5
6
7
enum E {
None,
Read = 1 << 1,
Write = 1 << 2,
ReadWrite = Read | Write,
L = "1234".length,
}

Union enums and enum member types

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
enum Kind {
Square,
Circle,
}

interface Circle {
kind: Kind.Circle
radius: number
}

interface Square {
kind: Kind.Square
length: number
}

let c: Circle = { kind: Kind.Circle, radius: 5 }

Enums at runtime

1
2
3
4
5
6
7
8
9
10
11
enum E {
X,
Y,
Z,
}

function f(obj: { X: number }) {
return obj.X
}

f(E) // work

Enums at compile time

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
enum LogLevel {
ERROR,
WARN,
INFO,
DEBUG,
}

type LogLevelString = keyof typeof LogLevel

function print(key: LogLevelString, message: string): void {
const num = LogLevel[key]
if (num <= LogLevel.WARN) {
console.log(`${key}-${num}-${message}`)
}
}

print("WARN", "warning")

Reverse mappings

1
2
3
4
5
6
enum E {
A,
}

let a = E.A
let getName = E[a] // 'A'