聊聊TypeScript中枚举对象(Enum) |
您所在的位置:网站首页 › 枚举变量的定义 › 聊聊TypeScript中枚举对象(Enum) |
前言
什么是枚举,顾名思义我们看到枚举这个词,脑子里就已经想到这是一个键值对的形式,就可以看做是我们JavaScript中的json对象一样。在ts中声明枚举对象的关键字是使用enum,枚举成员一但定义就不可改变了。下面来介绍一下ts中的枚举对象。 数字枚举我们先来说一下数字枚举, 一目了然,一看就知道数字枚举的成员都是number类型的。下面我们来看看创建一个简单的枚举对象吧。 enum device { phone, notebook, desktop } console.log(device.phone) // 0 复制代码上面的值是phone 0、notebook 1、desktop 2。 只要定义了枚举对象,默认不赋值,那么当前的枚举对象里面第一个的值从0开始依次递增。 看下面栗子 enum device { phone = 3, notebook, desktop } 复制代码上面我们默认给phone赋值一个3,那么下面两个值也会默认递增,会变成notebook = 4、desktop = 5。 注意事项 - 枚举对象递增 枚举对象成员递增值为1 枚举对象成员递增只会看当前值的前一个枚举成员是否有值,有值的话后面依次跟着递增。跟第一个枚举成员值无关数字枚举对象会存在反向映射 enum device { phone notebook, desktop } 复制代码通过上面栗子我们可以知道,device.notebook = 1。但还可以通过device[1]获取出来notebook,这就是因为存在反向映射(key和value可以互相访问)。 需要注意的是,只有数字枚举成员才会有反向映射,字符串或其它值是没有的。 来看下枚举对象被编译后的 我们再来看一个问题 enum device { phone = 2, notebook = 1, desktop } console.log(device.phone) // 2 console.log(device[2]) // desktop 复制代码可以看到上面代码中,device.phone = 2 ,然后我们使用反向这种方式访问device[2]却是desktop。这是因为默认我们给phone赋值为2,然后又给notebook赋值为1,这时desktop跟着上一个枚举成员(notebook)值去递增,所以这时2已经被替换为desktop了。 这里需要注意,避免踩坑,ts是不会检查出来的重复的值。 字符串枚举看过了上面的数字枚举,再来看字符串枚举,显然就明白字符串枚举成员的值肯定都是string类型。字符串枚举对象是没有反向映射的。 enum device { phone = "1", notebook = "2", desktop = "3" } 复制代码我们来看一下编译后的代码 可以看到上面编译后的代码没有反向映射的代码。 字符串枚举是没有递增的,当前的枚举成员前一个值为字符串,那么当前的枚举对象如果不赋值就会报错。 enum device { phone = "1", notebook } 复制代码上面这种情况就会导致编译阶段报错。"枚举成员必须具有初始化表达式",待会我们就会讲到枚举对象的表达式。 异构枚举异构枚举是啥呢,直白的说就是一个枚举对象中可以包括数字枚举成员和字符串枚举成员,就是可以混合使用。但是我们要正儿八经的使用枚举对象的话,一般还真不会使用异构枚举,就像文档说的一样,似乎你并不会这么做。 enum Person { name = "前端娱乐圈", age = 18 } 复制代码在看一个栗子 enum Person { name = "前端娱乐圈", age = 3 * 6 } 复制代码上面这种是会报错的,“含字符串值成员的枚举中不允许使用计算值”,枚举对象成员有字符串的则不能再设置其它枚举对象成员为计算的值(3 * 6)。但是可以直接写字面量的。下面我们会讲到计算 计算的和常量成员枚举对象中的枚举成员都带有一个值,这个值是计算的或常量。那么怎么看是计算的还是常量呢。这就讲到我们上面说的枚举对象成员表达式,只要是表达式那一定就是常量否则就是计算的。所以只需要知道枚举成员是表达式就知道它就是常量。 当满足下面其中一个条件那么它就是一个表达式。以下借用官方的规则条件 一个枚举表达式字面量(主要是字符串字面量或数字字面量) 一个对之前定义的常量枚举成员的引用(可以是在不同的枚举类型中定义的) 带括号的常量枚举表达式 一元运算符 +, -, ~其中之一应用在了常量枚举表达式 常量枚举表达式做为二元运算符 +, -, *, /, %, , >>>, &, |, ^的操作对象。 若常数枚举表达式求值后为 NaN或 Infinity,则会在编译阶段报错。上面这些条件成立之后那么当前枚举成员就是一个常量。常量就是可以在编译阶段求值的 常量 enum obj { index, // 满足条件 常量 index1 = index, // 满足条件 常量 age = 2 |
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |