欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

3.typescript的数据类型-枚举(enum)

程序员文章站 2022-03-21 19:40:13
1.枚举初识默认情况下,枚举是从0开始的,后面的值依次递增,它们当中的每个值都可以显示指定,只要不出现重复即可,没有被显示指定的值,会以前一个值为基础递增得到enum Color {red,yellow,green}let c: Color = Color.red // 1let str:string = Color[1] // yellow,这个写法不太友好let str1:string = Color[Color.green] // green,推荐使用console.log(...

1.枚举初识

默认情况下,枚举是从0开始的,后面的值依次递增,它们当中的每个值都可以显示指定,只要不出现重复即可,没有被显示指定的值,会以前一个值为基础递增得到

enum Color {
	red,
	yellow,
	green
}
let c: Color = Color.red // 1
let str:string = Color[1] // yellow,这个写法不太友好
let str1:string = Color[Color.green] // green,推荐使用
console.log(Color['red'] === 0) //true
console.log(Color['yellow'] === 1) //true
console.log(Color[0] === 'red') //true
console.log(Color[1] === 'yellow') //true
  • 以上代码对应的js代码为
var Color;
(function (Color) {
    Color[Color["red"] = 0] = "red";
    Color[Color["blue"] = 1] = "blue";
    Color[Color["green"] = 2] = "green";
})(Color || (Color = {}));

2.常量枚举

常数枚举与普通枚举的区别是,它会在编译阶段被删除,并且不能包含计算成员,假如包含了计算成员,则会在编译阶段报错

const enum Color {
	red,
	yellow,
	green
}
let str:Color = Color.yellow

编译后的js代码为

var str = 1

为什么编译后的js代码只剩一行了呢?

  • 直接内联此枚举项的值
  • 不再为常量枚举类型生成对应的js代码

我们还需要注意的是:常量枚举不能使用Color[1]或者Color[Color.red]这样的语法来获取枚举项字符串名称了,因为常量枚举没有生成对应枚举项的代码

3.枚举项默认值

1.首个枚举项的默认值设置为1,为什么呢?

我们都知道首个枚举项的默认值是0,但是在js中0代表false,如果想要判断某个枚举值是否存在,难道我们每次都要先判断是不是typeof (Color.red) === 'undefined’吗?为了避免这种情况,我们把首个枚举项设置为1,然后后续的枚举项以1为基础递增,消除了0的情况

enum Color {
	red = 1,
	yellow,
	green
}

2.不建议为枚举项设置字符串数据类型

enum Color {
	red,
	green,
	blue = 'blue color'
}

编译后的js代码为

var Color;
(function (Color) {
    Color[Color["red"] = 0] = "red";
    Color[Color["green"] = 1] = "green";
    Color["blue"] = "blue color";
})(Color || (Color = {}));

会发现,我们不能使用Color[Color.blue]来获取枚举项的对应的名称了

如果我们这样写

enum Color {
	red,
	green = 'green color',
	blue // error: Enum member must have initializer
}

ts会直接报错,因为green后续的枚举项无法根据’green color’这个字符串进行递增

本文地址:https://blog.csdn.net/qq_35629054/article/details/107383106

相关标签: ts