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]);
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]);
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);
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);
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);
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));
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);
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.