使用枚举我们可以如何定义枚举类型一些带名字的常量吗?

这篇文章主要介绍了TypeScript 枚举类型,TypeScript 在 ES 原有类型基础上加入枚举类型,使得在 TypeScript 中也可以给一组数值赋予名字,这样对开发者比较友好,可以理解枚举就是一个字典,文章内容围绕TypeScript 枚举类型展开内容,需要的朋友可以参考一下

  • 6. 枚举成员类型和联合枚举类型

TypeScript 在 ES 原有类型基础上加入枚举类型,使得在 TypeScript 中也可以给一组数值赋予名字,这样对开发者比较友好,可以理解枚举就是一个字典。

枚举类型使用enum来定义:

上面定义的枚举类型的Day,它有7个值,TypeScript会为它们每个值分配编号,默认从0开始,在使用时,就可以使用名字而不需要记数字和名称的对应关系了:

下面是将上面代码转译为 JavaScript 后的效果:

可以看到,每一个值都被赋予了对应的数字。

在TypeScript中,我们需要通过点的形式获取枚举集合中的成员:

说完枚举类型的基本使用,下面就来看一下常见的枚举类型。

在上面的例子中,在仅指定常量命名的情况下,定义的就是一个默认从 0 开始递增的数字集合,称之为数字枚举。如果想要从其他值开始递增,可以将第一个值的索引值进行指定:

可以对一个字段指定一个索引值,那他后面没有指定索引值的就会依次加一:

除此之外,还可以给每个字段指定不连续的任意索引值:

数字枚举在定义值时,可以使用计算值和常量。但是要注意,如果某个字段使用了计算值或常量,那么该字段后面紧接着的字段必须设置初始值,这里不能使用默认的递增值了,来看例子:

TypeScript 将定义值是字符串字面量的枚举称为字符串枚举,字符串枚举值要求每个字段的值都必须是字符串字面量,或者是该枚举值中另一个字符串枚举成员:

注意:这里的其他枚举成员指的是同一个枚举值中的枚举成员,因为字符串枚举不能使用常量或者计算值,所以不能使用其他枚举值中的成员。

TypeScript 中定义的枚举,编译之后其实是一个对象,生成的代码中,枚举类型被编译成一个对象,它包含了正向映射( name -> value)和反向映射( value -> name)。

可以看到,TypeScript 会把定义的枚举值的字段名分别作为对象的属性名和属性值,把枚举值的字段值分别作为对象的属性值和属性名,同时添加到对象中。这样既可以通过枚举值的字段名得到值,也可以通过枚举值的值得到字段名。

异构枚举就是枚举值中成员值既有数字类型又有字符串类型,如下:

在开发过程中不建议使用异步枚举。因为往往将一类值整理为一个枚举值时,它们的特点是相似的。比如在做接口请求时的返回状态码,如果是状态码都是数值,如果是提示信息,都是字符串,所以在使用枚举的时候,往往是可以避免使用异构枚举的,主要是做好类型的整理。

TypeScript中,定义了枚举值之后,编译成 JavaScript 的代码会创建一个对应的对象,这个对象可以在程序运行时使用。但是如果使用枚举只是为了让程序可读性好,并不需要编译后的对象呢?这样会增加一些编译后的代码量。TypeScript 中有一个const enum(常量枚举),在定义枚举的语句之前加上const关键字,这样编译后的代码不会创建这个对象,只是会从枚举里拿到相应的值进行替换:

上面的代码编译成 JavaScript 之后是这样的:

通过定义常量枚举,可以以清晰、结构化的形式维护相关联的常量集合。而且因为转译后抹除了定义、内联成员值,所以在代码的体积和性能方面并不会比直接内联常量值差。

6. 枚举成员类型和联合枚举类型

如果枚举值里所有成员都是字面量类型的值,那么枚举的每个成员和枚举值本身都可以作为类型来使用,我们称这样的枚举成员为字面量枚举成员。

满足条件的枚举成员的值有以下三种:

  • 没有初始值的枚举成员,例如:enum E { A }

当所有枚举成员都拥有字面量枚举值时,就枚举成员成为了类型:

可以看到,代码的第七行使用Animal.Dog作为类型,指定接口Dog的必须有一个type字段,且类型为Animal.Dog

当枚举值符合条件时,这个枚举值就可以看做是一个包含所有成员的联合类型:

说完常见的枚举类型,最后来看看枚举合并的概念。对于枚举类型的值,我们可以分开进行声明:

到此这篇关于详解 TypeScript 枚举类型的文章就介绍到这了

但其实Java的枚举还有很多先进的功能,这些功能可以帮助开发者写出更简洁且不易出错的代码。

接下来我会列举一些Java的高级枚举功能,以及如何利用这些功能来使得开发更高效,更具可读性。

首先,我们要确认一点,枚举是Java的一个类。

比如创建下面一段代码,枚举的基类Enum<E>

上述代码是一个普通的抽象类,有两个字段,name和ordinal。

由于枚举都是类,所以我们能够为枚举提供实例方法、构造函数和字段,还可以重写 toString()

此枚举表示可以对两个值操作并将产生结果。

一般来说,初学者更偏向于使用switch 语句来完成这个功能,如下代码所示:

这个实现存在一些问题。

①如果我们向Operation添加新操作,编译器不会通知此switch没有正确处理新的操作。

②遇到default情况,就算我们知道它永远不会发生,这也是必需的。

但还好,Java 8 使用函数式编程为我们提供了一个干净的解决方案。

由于枚举是类,我们可以创建一个枚举字段来保存函数。如何来完成这一操作?

首先,让我们将开关放在枚举类中。

上述代码中是从 inside 调用方法Operation,可以将其更改为实例方法,并使用this关键字,而不是将所需的Operation作为参数传递。

现在让我们更进一步,通过使用函数式编程完全消除 switch 语句。

上述代码中做了三件事:

java.util.function.BiFunction operation字段是对带有两个参数的函数(方法)的引用。在上述代码示例中,两个参数都是整数,返回值也是整数。但是Java 参数化类型不支持原语,因此必须使用Integer。

但是,这种实现会比switch好一些,因为编译器会在Operation添加新功能时会要求开发者实现新功能。

枚举可以有字段、构造函数和实例方法。

Java 枚举字段可以存储函数与 lambda 配合使用,也可以创建一个函数的干净、安全的特定于枚举的实现,并在编译时强制执行(不使用switch)。

以上就是Enum高阶的使用方法,希望对你有帮助。

破案1101起查缴财物6.9亿元!江苏打击整治养老诈骗专项行动战果显著

破案1101起查缴财物6.9亿元!江苏打击整治养老诈骗专项行动战果显著

我要回帖

更多关于 如何定义枚举类型 的文章

 

随机推荐