7 种枚举类型
数据枚举
- 默认是从 0 开始递增的数字集合
可指定任意类型(比如整数、负数、小数等)、任意起始的数字,其后未显示指定值的成员会递增加 1。
enum Day {
SUNDAY = 1,
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY
}
字符串枚举
定义值是字符串字面量的枚举称之为字符串枚举
enum Direction {
Up = 'Up',
Down = 'Down',
Left = 'Left',
Right = 'Right'
}
异构枚举
支持枚举类型同时拥有数字和字符类型的成员
enum Day {
SUNDAY = 'SUNDAY',
MONDAY = 2,
...
}
常量成员、计算(值)成员
常量成员
- 字符串、数字字面量,未指定初始值从 0 开始的数字常量;
- 引用来自预先定义的常量成员,比如来自当前枚举或其他枚举;
- 圆括号包含的常量枚举表达式;
- 在常量表达式上运用一元运算符+、-、~;
- 操作常量表达式中的二元运算符+、-、*、/、%、<<、>>、>>>、&、|、^;
计算(值)成员
除以上这些情况之外,其他都被认为是计算(值)成员。
枚举成员类型和联合枚举
枚举成员
- 缺省值(从0开始递增)
- 数字字面量
- 字符串字面量
常量枚举
const 修饰符定义常量枚举,常量枚举定义转译为 JavaScript 之后会被移除,并在使用常量枚举成员的地方被替换为相应的内联值,因此常量枚举的成员都必须是常量成员(字面量 + 转译阶段可计算值的表达式)。
const enum Day {
SUNDAY,
MONDAY
}
const work = (d: Day) => {
switch (d) {
case Day.SUNDAY:
return 'take a rest';
case Day.MONDAY:
return 'work hard';
}
}
}
外部枚举
通过 declare 描述一个在其他地方已经定义过的枚举类型,通过这种方法定义出来的枚举类型,被称为外部枚举。
declare enum Day {
SUNDAY,
MONDAY,
}
const work = (x: Day) => {
if (x === Day.SUNDAY) {
x; // 类型是 Day
}
}
外部枚举和常量枚举的区别:
- 在外部枚举中,没有被指定初始值的成员都会被当做计算(值)成员,这跟常量枚举恰好相反。
- 即使外部枚举只包含字面量成员,这些成员的类型也不会是字面量成员类型,自然完全不具备字面量类型的各种特性。
枚举的本质
可以把枚举类型看成一个JavaScript对象,而由于其特殊的构造,导致其拥有正反向同时映射的特性。