枚举
在 TS 中可以通过枚举定义一些带名字的常量。
数字枚举
enum Driection {
Up = 1,
Down,
Left,
Right
}
这段代码定义了一个名为 Direction 的枚举,其中 Up 初始值为1,则其他成员会依次递增 2 3 4。
需要注意的是,如果不给成员初始化,默认会从1开始递增。
使用枚举:
enum Response {
No = 0,
Yes = 1
}
console.log(Response.Yes) // 输出 0
字符串枚举
不同于数字枚举的自动递增初始化,字符串枚举需要自行初始化成员的值。
例如:
enum Direction {
Up = "UP",
Down = "DOWN",
LEFT = "LEFT",
Right = "RIGHT"
}
异构枚举
即枚举内部可以混合使用字符串和数字成员。
例如:
enum StringAndNumber {
No = 0,
Yes = "YES"
}
计算和常量成员
计算和常量成员是指在一定情况下,枚举会对成员进行一定的计算初始化过程。
例如:
enum InitData {
initData
}
// 此时initData会初始化为0
还有一些其他情况,这里就不一一列举,有兴趣的同学可以去官网阅读
联合枚举与枚举成员
字面枚举成员就是一种特殊的非计算的常量枚举成员的子集。
字面枚举成员指不带有初始值的常量枚举成员,或被初始化为:任何字符串字面量、任何数字字面量、应用了一元-符号的数字字面量。
- 使用枚举作为类型。
enum ShapeKind {
Circle, Square
}
interface Circle {
kind: ShapeKind.Circle;
radius: number
}
interface Square {
kind: ShapeKind.Square;
sideLength: number;
}
let c: Circle = {
kind: ShapedKind.Square, // 报错,因为定义的Circle是指定了ShapeKind.Circle的值而不是ShapeKind.Square的值
radius: 100
}
运行时的枚举
枚举也是一个对象。
例如:
enum E {
X, Y, Z
}
function fn(obj: { X: number })
fn(E) // fn函数的类型检测会通过 因为E.X是numebr
反向映射
枚举不仅提供了可以获取枚举的值,还可以通过赋值获取枚举的成员的名称。
例如:
enum Enum {
A
}
let a = Enum.A
let nameOfA = Enum[a] // 此时nameOfA为A
const枚举
即用 const 关键字声明枚举。
例如:
const enum A {
A
}
外部枚举
外部枚举用于描述已存在的枚举类型的形状,而外部枚举和内部枚举的一个重要区别就是,在正常的枚举里,没有初始化的成员会被当成常数成员,对于非常数的外部枚举而言,没有初始化方法时被当作需要计算的成员。
例如:
declare enum Enum {
A = 1,
B,
C = 2
}