- 为什么要使用枚举
- 枚举允许我们在开发过程中,为一组数组中的每一个元素赋予名称,如现在我们有一个number类型数组[1,2,3],这时每个元素实际上没有明确的名称或意义,但是当我们使用枚举为这个数组的每个元素规定了名称,那么就很方便的对应起来了。
首先我们将这个数组定义了一个名称是liveStatus,表示这个数组表示的含义是直播的状态,依次元素1对应的名称是直播中(Living),元素2对应的名称是回放(reply),元素3对应的名称是已结束(ended)。enum liveStatus{ Living = 1, reply, ended }
这样当我们得到1,如从后端返回这个status是1,那么我们很容易可以从这个枚举中获取到对应的状态,实际上是正在直播。
枚举简介
枚举是一个键值对的形式,可以看成是JavaScript中的JSON对象一样。
TS使用 enum 关键词声明枚举。
如何创建一个枚举,以数字枚举举例
- 使用enum关键词,关键词后接枚举的名称,然后创建一个大括号块,并在这个块里指定枚举成员。
enum Direction{ North = 1, East, //默认递增,所以值是2 South, //值是3 West, //值是4 };
数字枚举
数字枚举的成员都是number类型的。
对于数字枚举,如果没有对枚举对象中的枚举成员赋值,那么会默认从枚举对象中的第一个枚举成员的值是0,并依次递增。
如果想利用枚举对象的不同枚举成员获取不同的状态,那么可以使用switch。(因为后端返回enum类型的时候,尤其是数字枚举,只会返回对应的数字值)
enum liveStatus{ Living = 1, reply, preview, } swicth (status) case liveStatus.Living: return '直播中' case liveSatus.reply: return '回放' case liveStatus.preview: return '预告'
数字枚举的反向映射
数字枚举允许从value访问到key的反向映射。
enum device{ phone = 1, notebook, desktop, }
我们可以知道,phone对应的value是1,notebook对应的value是2,desktop对应的value是3。
正常来说,我们可以利用notebook来访问到2
console.log(device.notebook) //2
对于数字枚举,我们也可以通过2来访问到notebook。
console.log(device[2]) //notebook
字符串枚举
字符串枚举的枚举成员都是string类型。
字符串枚举没有反向映射。
enum device{ phone = "1", notebook = "2", desktop = "3", }
字符串枚举不能递增,所以必须对字符串枚举对象中的每一个枚举成员赋值。
enum device{ phone = "1", notebook }
这样就会报错,错误是“枚举成员必须具有初始化表达式”。
异构枚举
一个异构枚举对象可以包括2种枚举成员
- 数字枚举成员
- 字符串枚举成员
我们很少使用异构枚举
enum Person{ name = "aaa", age = 18 }
异构枚举中的常见错误
enum Person{ name = "aaa", age = 3*6 }
上面的枚举会报错,错误是“含有字符串值成员的枚举中不允许使用计算值”,含义是当枚举对象中存在有value是字符串的枚举成员的时候,不能将其他枚举成员的value设置为计算值。
枚举成员的值的2种形式:计算值和常量
枚举对象中的每一个枚举成员都对应一个value,这个value有2种形式,它可能是计算值 或 常量。
我们可以通过枚举成员表达式来判断枚举成员的value是计算值还是常量。只要是枚举成员的value是枚举成员表达式,那么这个value一定是常量。
判断是否是枚举成员表达式的方法
- 当满足以下5个条件中的任一个,那么就是枚举成员表达式
- 一个枚举表达式字面量(主要是字符串字面量或数字字面量)。
- 一个对之前定义的常量枚举成员的引用
- 带括号的常量枚举表达式
- 一元运算符 ++、 – 其中任一个应用在了常量枚举表达式
- 常量枚举表达式是二元运算符 + 、-、*、/、%、<<、>>、&、|、^的操作对象。如果求值后值为NaN或Infinity,那么会在编译阶段报错。
常量例子
enum Obj{ index, //枚举表达式字面量 index1 = index, //引用常量枚举成员 age = 2 << 1, //枚举表达式字面量参与二元运算符 num = 30 | 2, num1 = 10 + 29 }
计算值例子
enum Obj{ nameLen = 'aaa'.length, //不满足上面任何条件,那么是计算值 num = Math.random() * 100 }