TypeScript(五) Typescript 深入学习枚举

Typescript 深入学习枚举

数字枚举

  • 我们通过数字枚举
Javascript
enum Status {
  Uploading,
  Success,
  Failed
}
console.log(Status.Uploading); // 0
console.log(Status["Success"]); // 1
console.log(Status.Failed); // 2

一个枚举值包含三个字段,这个采用的默认序号

  • 修改默认编号
Javascript
enum Color{
  Red = 2,
  Blue,
  Yellow
}
console.log(Color.Red+"||"+Color.Blue+"||"+Color.Yellow);
//结果就是2||3||4
//指定任意字段的索引值
enum Status{
  Success = 200,
  NotFound = 404,
  Error = 500
}
console.log(Status.Success,Status.NotFound,Status.Error)
//200 404 500
//指定部分字段,其他使用默认递增索引
enum Status2{
 Ok=200,
 Created,
 Accepted,
 BadRequest=400,
 Unauthorized
}
console.log(Status2.Created,Status2.Accepted,Status2.Unauthorized)
// 201 202 401
  • 数字枚举还可以使用计算值或者常量来代替,但是设置了以后必须要在后面设置初始值
Javascript
const getValue = ()=>{
  return 0 ;
}
enum ErrorIndex{
  a = getValue(),
  b , //error枚举成员必须具有初始化值
  c
}
enum RightIndex{
  a = getValue(),
  b = 1 , //error枚举成员必须具有初始化值
  c
}
  • 反向映射 反向反射只支持数字枚举,字符枚举是不支持的
Javascript
enum Status{
  Success =200,
  NotFound = 404,
  Error = 500
}
console.log(Status["Success"]); // 200
console.log(Status[200]); //Success
console.log(Status[Status["Success"]]); //Success

字符串枚举

字符串枚举值要求每个字段的值都必须是字符串字面量,或者是该枚举值中另一个字符串枚举成员

Javascript
enum Message{
  Error = "Sorry,error",
  Success = Error,
  ClientError = Error
}
console.log(Message.Error); // Sorry ,error
console.log(Message.Success); //Sorry,error

异构枚举(不推荐使用)

Javascript
enum Result{
  Faild = 0,
  Success = "Success"
}

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

如果枚举值所有成员的值都是字面量类型的值,那么这个枚举的每个成员和枚举值本身都可以作为类型使用

  • 我们可以把符合条件的枚举值的成员当作类型使用

枚举类型

Javascript
enum Animal {
  Dog=1,
  Cat=2
}
interface Dog{
  type:Animal.Dog
}
interface Cat{
  type:Animal.Cat
}
let cat1:Cat = {
  type:Animal.Dog //error 报错
}
let dog1:Dog = {
  type:Animal.Dog //能通过
}

联合枚举类型

  • 当我们的枚举值符合条件时,这个枚举值就可以看作一个包含所有成员的联合类型
Javascript
enum Status{
  off,
  on
}
interface Light{
  status:Status;
}
enum Animal{
  Dog=1,
  Cat=2
}
const light1:Light = {
  status:Animal.Dog  //报错
}
const light2:Light = {
  status:Status.off
}
const light3:Light = {
  status:Status.on
}

上面例子定义接口 Light 的 status 字段的类型为枚举值,那么此时 status 的属性值必须为 Status.Off 和 Status.On 中的一个。相当于 status:Status.Off|| Status.On

const enum

有的时候我们不需要编译后对象,只需要取出值就行

Javascript
enum Status {
  Off,
  On
}
const enum Animal {
  Dog,
  Cat
}
const status = Status.On;
const animal = Animal.Dog;

总结

  • 数字类型的枚举,能反转

  • 字符类型的枚举不能反转,只能是字面量或者内部的属性值


文章作者: 雾烟云
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 雾烟云 !