首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

枚举_TypeScript笔记7

一.简介

枚举,就是一组具名常量:

Enums allow us to define a set of named constants.

按照枚举值的类型,把枚举分为数值枚举,字符串枚举以及异构枚举。此外,还有特殊的联合枚举,以及常量枚举和环境枚举

二.数值枚举

声明了4个方向常量,值分别为。这些值是自动初始化并自增而来的,想要从指定数值开始也很容易:

枚举值的这种自增机制相当省事,毕竟在大多数场景下我们并不关心具体的枚举值,只要保证唯一,能与其它同类枚举值区分开即可:

自增要有一个起始值,称之为initializer,因此,类似这样的场景下枚举值无法完成初始化:

无法在编译时确定自增起始值,就没办法通过自增机制自动填充枚举值。具体的,没被显式初始化的枚举值,要么最先出现,要么出现在在其它数值常量枚举值之后

反向映射

TypeScript里可用通过枚举值取到对应枚举常量名,这种特性称之为反向映射(reverse mapping),例如:

因为在声明数值枚举的同时建立了反向关系:

但仅限于数值枚举(为了弥补数值枚举在运行时的可读性缺陷),其它类型的枚举并不建立反向关系

三.字符串枚举

与数值枚举类似,字符串枚举的枚举值都是字符串,但有2点差异:

字符串枚举没有自增机制,要求每个成员都显式初始化

字符串枚举没有反向映射

对比数值枚举,字符串枚举的一大优势是在运行时仍能保留值的含义(比如Debug时取枚举值,仍然是可读的):

String enums allow you to give a meaningful and readable value when your code runs, independent of the name of the enum member itself.

自增而来的失去了可读性,所以不支持自增。同理,字符串枚举值本就可读,不再需要反向映射:

四.异构枚举

枚举值中既有数值也有字符串时,称之为异构枚举(heterogeneous enumeration)。此时根据值的类型,按照数值枚举和字符串枚举区别对待,例如:

P.S.语法上允许存在这样的“混合”枚举,但几乎没有理由这样做

常量值与计算值

枚举值要么是常量(constant),要么是计算值(computed)

具体的,常量是指:

第一个枚举成员,且没有初始值,就隐式赋值为0

没有初始值,且上一个枚举成员是个数值常量,就隐式赋值为上一个枚举值加一

枚举成员被显式赋值为常量枚举表达式(TypeScript表达式的子集,能在编译时求值,具体见constant enum expression)

例如:

五.联合枚举

特殊的,常量枚举成员中有一部分不需要在编译时求值:字面量枚举成员。包括那些没有初始值的常量枚举成员,或者被初始化成:

字符串字面量

数值字面量

带负号的数值字面量

如果所有成员都是字面量枚举成员,就叫联合枚举(union enums),此时会解锁一些新的特性:

枚举本身有了确切的类型含义(是所有枚举成员的联合体)

枚举成员也有了类型含义

枚举的类型

把枚举用作类型,可以约束取值集合,进而暴露类似的潜在问题:

枚举成员的类型

把枚举成员用作类型,可以明确要求只接受该枚举值:

六.常量枚举

上面介绍的几种枚举都与Class类似,具有值和类型的双重含义,因此在运行时也存在(不像接口只存在于编译时),例如:

而常量枚举仅存在于编译时,具体的,删掉枚举声明,引用处编译替换成常量,例如:

因此常量枚举中不允许存在计算值:

七.环境枚举

仅用作类型约束(或者说只声明不实现)的枚举,这一点与常量枚举类似,但环境枚举(ambient enums)用来描述现有枚举的类型,例如:

(摘自DefinitelyTyped/types/w3c-css-typed-object-model-level-1/index.d.ts)

环境枚举与其它枚举的区别在于,环境枚举中没有初始值的枚举成员都当做计算值,不论上一个枚举成员是不是数值常量

参考资料

Enums

联系ayqy

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190217G0Y1I800?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券