数字和字符串枚举

  • TS中支持两种枚举,一种是数字枚举,一种是字符串枚举

1.数字枚举

  • 默认情况下就是数字枚举
  • 数字枚举的取值默认从0开始递增
  • 数字枚举的取值可以是字面量,也可以是常量,也可以是计算的结果
  • 如果使用常量或计算结果给前面的枚举值赋值了,那么后面的枚举值也需要手动赋值
  1. const num = 666
  2. function getNum(){
  3. return 888
  4. }
  5. enum Gender{
  6. A = num,
  7. Male = 6,
  8. Female = getNum()
  9. }
  10. console.log(Gender.Male) // 0
  11. console.log(Gender.Female) // 1

2.枚举反向映射

  • 可以根据枚举值获取到原始值
  • 也可以根据原始值获取到枚举值
  1. enum Gender{
  2. Male,
  3. Female
  4. }
  5. console.log(Gender.Male) // 0
  6. console.log(Gender[0]) // Male

3.字符串枚举

  • 如果使用字符串给前面的枚举值赋值了,那么后面的枚举值也需要手动赋值
  • 和数字枚举不一样,字符串枚举不能使用常量或计算结果给枚举值赋值
  • 虽然字符串不能使用常量或计算结果给枚举值赋值,但是它可以使用内部其他的枚举值来赋值
  1. const str = 'abc'
  2. function getStr(){
  3. return 'abc'
  4. }
  5. enum Gender{
  6. Male = 'male',
  7. Female = 'female'
  8. Yaounde= Male
  9. // Male = str, // 报错
  10. //Female = getStr() // 报错
  11. }
  12. console.log(Gender.Male) // male
  13. console.log(Gender.Female) // female
  14. console.log(Gender.Yao) // male

4.异构枚举

  • 枚举中既包含数字又包含字符串,就称之为异构枚举
  • 如果是字符串枚举,那么无法通过原始值获取到枚举值
  1. enum Gender{
  2. Male = '666',
  3. Female = 'female'
  4. }
  5. console.log(Gender.Male) // 666
  6. console.log(Gender.Male) // female
  7. console.log(Gender['female']) // undefined

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

1.枚举成员类型

  • 把枚举成员当成类型使用
  1. enum Gender{
  2. Male,
  3. Female
  4. }
  5. interface TestInterface{
  6. age:Gender.Male
  7. }
  8. class Person implements TestInterface{
  9. //age:Gender.Male
  10. //age:Gender.Female // 由于类型不匹配,所以会报错
  11. age:0 // 由于数字枚举的本质就是数值,所以在这里写一个数值也不会报错、
  12. //注意点:如果是字符串枚举,那么只能是枚举成员的值,不能是其他的值
  13. }

2.联合枚举类型

  • 把枚举类型当作一个联合类型使用

2.1什么是联合类型?

  • 联合类型就是将多种数据类型当作一个联合类型来使用
  1. let value:(number | string)
  2. value = 1
  3. value = '123'
  • 我们可以把枚举类型当作一个联合类型来使用
  1. enum Gender{
  2. Male,
  3. Female
  4. }
  5. interface TestInterface {
  6. age:Gender // age:(Gender.Male|Gender.Female)
  7. }
  8. class Person implements TestInterface {
  9. //age:Gender.Male
  10. age:Gender.Female
  11. }

运行时枚举和常量枚举

1.运行时枚举

  • 枚举在编译之后是一个真实存储的对象,所以可以在运行时使用
  • 而像接口这这种只是用来做约束静态检查的代码,编译之后是不存在的

2.常量枚举

  • 普通枚举和常量枚举的区别:
    • 普通枚举会生成真实存在的对象
    • 常量枚举不会生成真实存在的对象,而是利用枚举成员的值直接替换使用到的地方
  1. enum Gender1{
  2. Male,
  3. Female
  4. }
  5. console.log(Gender1.Male === 0)
  6. const enum Gender2{
  7. Male,
  8. Female
  9. }
  10. console.log(Gender2.Male)