TypeScript Enum

Enum is a very useful feature in TypeScript that allows us to define a set of named constants. Enums can make code easier to read and maintain, replacing "magic numbers" with meaningful names.


Numeric Enum

By default, enums are numbered starting from 0.

Example

enum Direction {
    Up,    // 0
    Down,  // 1
    Left,  // 2
    Right  // 3
}

var dir: Direction = Direction.Up;
console.log("Direction: " + dir);
console.log("Direction name: " + Direction[0]);

Output:

方向: 0
方向名称: Up

Manual Assignment

You can manually assign values to enum members.

Example

enum Status {
    Success = 1,
    Error = 2,
    Pending = 3
}

console.log("Status: " + Status.Success);
console.log("Status name: " + Status[1]);

Output:Fortune

Status: 1
状态名称: Success

String Enum

In string enums, each member must have a string literal value.

Example

enum Message {
    Success = "SUCCESS",
    Error = "ERROR",
    Warning = "WARNING"
}

console.log("Message: " + Message.Success);

Output:

Message: SUCCESS

Constant Enum

UsingconstEnums modified with const are inlined at compile time, generating more optimized code.

Example

const enum Color {
    Red = "RED",
    Green = "GREEN",
    Blue = "BLUE"
}

var favoriteColor: Color = Color.Red;
console.log("Favorite color: " + favoriteColor);

Heterogeneous Enum

Enums can mix numeric and string values, but this is not recommended.

Example

enum BooleanLikeHeterogeneousEnum {
    No = 0,
    Yes = "YES"
}

console.log("Value: " + BooleanLikeHeterogeneousEnum.No);
console.log("String value: " + BooleanLikeHeterogeneousEnum.Yes);

Enum Member Types

When all enum members are literal values, the member type can be used as a type.

Example

enum ShapeKind {
    Circle = "circle",
    Square = "square"
}

interface Circle {
    kind: ShapeKind.Circle;
    radius: number;
}

interface Square {
    kind: ShapeKind.Square;
    sideLength: number;
}

var c: Circle = {
    kind: ShapeKind.Circle,
    radius: 10
};

console.log("Circle: " + JSON.stringify(c));

Runtime Enums

Regular enums are kept as real objects at runtime.

Example

enum FileAccess {
    Read = 1 << 1,
    Write = 1 << 2,
    ReadWrite = Read | Write
}

console.log("File access: " + FileAccess.ReadWrite);

Output:

文件访问: 6

Summary

  • Numeric enums:Default starts at 0, can be manually assigned.
  • String enums:Each member must be a string literal.
  • Constant enums:Use const, inlined at compile time.
  • Heterogeneous enums:Mixing numbers and strings, not recommended.
  • Member types:Literal enum members can be used as types.
Other Extensions