定义
枚举是 TypeScript 的少数功能之一,它不是 JavaScript 的类型级扩展。
枚举允许开发人员定义一组命名常量。使用枚举可以更轻松地记录意图,或创建一组不同的案例。TypeScript 提供基于数字和基于字符串的枚举。
数字类型枚举
enum Direction {
Up = 1,
Down,
Left,
Right
}
我们定义了一个数字枚举,Up使用初始化为1。 其余的成员会从1开始自动增长。 换句话说,Direction.Up的值为1,Down为2,Left为3,Right为4。如果Up的初始化值不设置。那么它默认就是0,然后其余的枚举字段的值,以此类推。
使用枚举很简单:通过枚举的属性来访问枚举成员,和枚举的名字来访问枚举类型 Response.Yes message: Response
enum Response {
No = 0,
Yes = 1,
}
function respond(recipient: string, message: Response): void {
// ...
}
respond("Princess Caroline", Response.Yes)
字符串类型枚举
enum Direction {
Up = "UP",
Down = "DOWN",
Left = "LEFT",
Right = "RIGHT",
}
字符串枚举没有自增长的行为。
反向映射
字符串类型枚举
var Direction1;
(function (Direction1) {
Direction1["Up"] = "UP";
Direction1["Down"] = "DOWN";
Direction1["Left"] = "LEFT";
Direction1["Right"] = "RIGHT";
})(Direction1 || (Direction1 = {}));
---------------------------------------------
数字类型枚举
var Direction;
(function (Direction) {
Direction[Direction["Up"] = 1] = "Up";
Direction[Direction["Down"] = 2] = "Down";
Direction[Direction["Left"] = 3] = "Left";
Direction[Direction["Right"] = 4] = "Right";
})(Direction || (Direction = {}));
生成的代码中,枚举类型被编译成一个对象,它包含了正向映射(name -> value)和反向映射(value -> name)。 引用枚举成员总会生成为对属性访问并且永远也不会内联代码。
要注意的是_不会_为字符串枚举成员生成反向映射。
计算的和常量成员
enum FileAccess {
// constant members
None,
Read = 1 << 1,
Write = 1 << 2,
ReadWrite = Read | Write,
// computed member
G = "123".length
}
-
枚举成员使用_常量枚举表达式_初始化。 常量枚举表达式是TypeScript表达式的子集,它可以在编译阶段求值。 当一个表达式满足下面条件之一时,它就是一个常量枚举表达式:
- 一个枚举表达式字面量(主要是字符串字面量或数字字面量)
- 一个对之前定义的常量枚举成员的引用(可以是在不同的枚举类型中定义的)
- 带括号的常量枚举表达式
- 一元运算符
+,-,~其中之一应用在了常量枚举表达式 - 常量枚举表达式做为二元运算符
+,-,*,/,%,<<,>>,>>>,&,|,^的操作对象。
若常量枚举表达式求值后为
NaN或Infinity,则会在编译阶段报错。
联合枚举与枚举成员的类型
enum ShapeKind {
Circle,
Square,
}
interface Circle {
kind: ShapeKind.Circle;
radius: number;
}
interface Square {
kind: ShapeKind.Square;
sideLength: number;
}
let c: Circle = {
kind: ShapeKind.Square, // Error! Type 'ShapeKind.Square' is not assignable to type 'ShapeKind.Circle'.
radius: 100,
}
const枚举
const enum Directions {
Up,
Down,
Left,
Right
}
let directions = [Directions.Up, Directions.Down, Directions.Left, Directions.Right]
生成之后的代码:
var directions = [0 /* Up */, 1 /* Down */, 2 /* Left */, 3 /* Right */];
总结
在日常的开发中,我用到是const枚举,和联合枚举的使用。在ts定义中,还有外部枚举,这个我没有理解,如果有知道的小伙伴,还请多多指教。