数字和字符串枚举
- TS中支持两种枚举,一种是数字枚举,一种是字符串枚举
1.数字枚举
- 默认情况下就是数字枚举
- 数字枚举的取值默认从0开始递增
- 数字枚举的取值可以是字面量,也可以是常量,也可以是计算的结果
- 如果使用常量或计算结果给前面的枚举值赋值了,那么后面的枚举值也需要手动赋值
const num = 666function getNum(){ return 888}enum Gender{ A = num, Male = 6, Female = getNum()}console.log(Gender.Male) // 0console.log(Gender.Female) // 1
2.枚举反向映射
- 可以根据枚举值获取到原始值
- 也可以根据原始值获取到枚举值
enum Gender{ Male, Female}console.log(Gender.Male) // 0console.log(Gender[0]) // Male
3.字符串枚举
- 如果使用字符串给前面的枚举值赋值了,那么后面的枚举值也需要手动赋值
- 和数字枚举不一样,字符串枚举不能使用常量或计算结果给枚举值赋值
- 虽然字符串不能使用常量或计算结果给枚举值赋值,但是它可以使用内部其他的枚举值来赋值
const str = 'abc'function getStr(){ return 'abc'}enum Gender{ Male = 'male', Female = 'female', Yaounde= Male // Male = str, // 报错 //Female = getStr() // 报错}console.log(Gender.Male) // maleconsole.log(Gender.Female) // femaleconsole.log(Gender.Yao) // male
4.异构枚举
- 枚举中既包含数字又包含字符串,就称之为异构枚举
- 如果是字符串枚举,那么无法通过原始值获取到枚举值
enum Gender{ Male = '666', Female = 'female',}console.log(Gender.Male) // 666console.log(Gender.Male) // femaleconsole.log(Gender['female']) // undefined
枚举成员类型和联合枚举类型
1.枚举成员类型
enum Gender{ Male, Female}interface TestInterface{ age:Gender.Male}class Person implements TestInterface{ //age:Gender.Male //age:Gender.Female // 由于类型不匹配,所以会报错 age:0 // 由于数字枚举的本质就是数值,所以在这里写一个数值也不会报错、 //注意点:如果是字符串枚举,那么只能是枚举成员的值,不能是其他的值}
2.联合枚举类型
2.1什么是联合类型?
let value:(number | string)value = 1value = '123'
enum Gender{ Male, Female}interface TestInterface { age:Gender // age:(Gender.Male|Gender.Female)}class Person implements TestInterface { //age:Gender.Male age:Gender.Female}
运行时枚举和常量枚举
1.运行时枚举
- 枚举在编译之后是一个真实存储的对象,所以可以在运行时使用
- 而像接口这这种只是用来做约束静态检查的代码,编译之后是不存在的
2.常量枚举
- 普通枚举和常量枚举的区别:
- 普通枚举会生成真实存在的对象
- 常量枚举不会生成真实存在的对象,而是利用枚举成员的值直接替换使用到的地方
enum Gender1{ Male, Female}console.log(Gender1.Male === 0)const enum Gender2{ Male, Female}console.log(Gender2.Male)