TypeScript入门:枚举类型

389 阅读2分钟

数字枚举

enum Role {
    Reporter = 1,
    Developer,
    Maintainer,
    Owner,
    Guest
}
console.log(Role.Reporter) // 1
console.log(Role.Developer) // 2
console.log(Role[2]) // 'Developer'

默认第一个成员的值为0,后面成员的值依次递增,但是也可以给每个成员赋值一个初始值,可以通过字符串去索引数字,也可以通过数字去索引字符串

字符串枚举

enum Message {
    Success = 'success',
    Fail = 'fail'
}

console.log(Message.Success) // 'success'
console.log(Message['success']) // undefined

只能通过Success去索引success,不能反过来用success去索引Success

异构枚举

enum Answer {
    N,
    Y = 'Yes'
}
console.log(Answer.N) // 0
console.log(Answer.Y) // 'Yes'

枚举的成员中同时出现数字和字符串,不建议使用

枚举成员

enum Char {
    // const member(常量枚举成员)
    a,
    b = Char.a,
    c = 1 + 3,
    // computed member(计算枚举成员)
    d = Math.random(),
    e = '123'.length,
    f = 4
}

常量枚举成员会在编译阶段计算出结果,然后以常量值的方式出现在运行环境,计算枚举成员不会在编译阶段被计算,会被保留到运行阶段,在运行阶段才会计算出结果。 注意:在计算成员后面的枚举成员一定要赋值一个初始值

// ts编译结果
"use strict";
var Char;
(function (Char) {
    // const member(常量枚举成员)
    Char[Char["a"] = 0] = "a";
    Char[Char["b"] = 0] = "b";
    Char[Char["c"] = 4] = "c";
    // computed member(计算枚举成员)
    Char[Char["d"] = Math.random()] = "d";
    Char[Char["e"] = '123'.length] = "e";
    Char[Char["f"] = 4] = "f";
})(Char || (Char = {}));

常量枚举

使用const定义的枚举叫常量枚举,特点是代码会在编译后被移除

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

当我们不需要用到对象,而需要用到对象里面的值的时候,可以使用常量枚举,常量枚举编译后的代码会在编译后被移除,从而减少了编译后的代码,让代码看起来更简洁。

// 编译后代码
"use strict";
let month = [0 /* Jan */, 1 /* Feb */, 2 /* Mar */];

枚举类型

有三种枚举类型:

  1. 枚举成员没有初始值
  2. 枚举成员都是数字枚举
  3. 枚举成员都是字符串枚举 在某些情况下,枚举和枚举成员都可以作为单独的一种类型存在
// 枚举成员没有初始值
enum E { a, b }
// 枚举成员都是数字枚举
enum F { a = 0, b = 1 }
// 枚举成员都是字符串枚举
enum G { a = 'apple', b = 'banana' }

// 可以把任意的数字赋值给E和F类型
let e: E = 3
let f: F = 3
e === f // 报错,不同枚举类型不能相互比较
 
// 变量定义为枚举成员类型
let e1: E.a = 3
let e2: E.b = 3
let e3: E.a = 3
console.log(e1 === e2) // e1和e2是不同的枚举成员类型,会报错
console.log(e1 === e3) // true e1和e3是相同的枚举成员类型,可以比较

// 字符串枚举的取值只能是枚举成员的取值
let g1: G = G.a
let g2: G.a = G.a