天天看点

TypeScript入门:枚举类型

数字枚举

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

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

TypeScript入门:枚举类型

字符串枚举

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) // 0console.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复制代码      

继续阅读