枚举类型

枚举是一组有名字的常量集合

数字枚举-枚举值会递增,并采用反向映射的原理
enum Role {
  Reporter = 2,
  Developer,
  Maintainer,
  Owner,
  Guest
}
console.log(Role.Reporter) // 2
console.log(Role[4]) // Maintainer
console.log(Role) // =>
// [2: "Reporter"
// 3: "Developer"
// 4: "Maintainer"
// 5: "Owner"
// 6: "Guest"
// Developer: 3
// Guest: 6
// Maintainer: 4
// Owner: 5
// Reporter: 2]
字符串枚举-编译结果显示只有成员名称作为key,所以它不能进行反向映射的
enum Message {
  Success = '成功',
  Fail = '失败'
}
异构枚举-数字枚举和字符串枚举混用的结果,容易引起混淆,不建议使用
enum Answer {
  N,
  Y = 'yes'
}

枚举成员

枚举成员的值是只读类型,定义后不能修改。

1.const member(常量枚举),包括三种情况:没有初始值的情况、对已有枚举成员的引用、常量的表达式,常量枚举成员会在编译的时候计算结果,然后以常量的形式出现在运行时环境。

enum Char {
  a,
  b = Char.a,
  c = 1 + 4
}

2.computed member,指需要被计算的枚举成员,是一些非常量的表达式,这些枚举成员的值不会在编译阶段计算,而是在程序执行阶段计算。

enum Char {
  d = Math.random(),
  e = '123'.length,
  f // 提示错误
}

PS:
  特别注意:在computed member后的成员一定要赋给初始值,否则会提示错误

常量枚举

特性:会在编译阶段被移除
作用:当我们不需要一个对象,而需要这个对象的值时,就需要使用常量枚举,这样减少在编译环境的代码

const enum Month {
  Jan,
  Feb,
  Mar
}
let month = [Month.Jan, Month.Feb, Month.Mar]

PS:
  会被编译成:
  var month = [0 /* Jan */, 1 /* Feb */, 2 /* Mar */];

枚举类型

在某些情况下,枚举和枚举成员都可以作为一种单独类型存在。
第一种情况,枚举成员没有任何初始值;
第二种情况,所有成员都是数字枚举;
第三种情况,所有成员都是字符串枚举。

enum E { a, b }
enum F { a = 0, b = 1 }
enum G { a = 'apple', b = 'banana' }

对于第一种和第二种情况,可以把任意的number类型赋值给枚举类型,它的取值也可以超出枚举成员的定义,但是两种不同类型的枚举不能进行比较:

let e: E = 3
let f: F = 3
// console.log(e === f) // 提示错误


let e1: E.a = 1
let e2: E.b
// console.log(e1 === e2) // 提示错误
let e3: E.a = 1
console.log(e1 === e3) // true

而第三种情况字符串枚举的取值只能是枚举成员的类型

let g1: G = G.a
let g2: G.a = G.a
posted @ 2020-04-07 10:58  我要去流浪  阅读(378)  评论(0编辑  收藏  举报