TypeScript相关知识点整理_枚举

200 阅读2分钟

枚举

  • 键和值的映射,利用键可以得到对应的值,或用值得到对应的键
  • 枚举是一种高级变量类型,类似于类,既可以作为接口进行类型声明,同时也进行赋值操作

枚举类型

  • 枚举类型指具备枚举特性的一组成员,其成员的值也是其成员的类型
  enum ShapeKind {
    Circle,  //0
    Square,  //1
  }
   
  //接口定义类型
  interface Circle {
    kind: ShapeKind.Circle;  //0
    kind0: typeof ShapeKind.Square;  //1
    radius: number;
  }
  
  let circle: Circle = {
    kind: 0,
    kind0: 1,
    // kind0: 100,  //error
    radius: 10
  }

枚举定义方式

手动赋值

    enum UserResponse {
      No = 0,
      Yes = 1,
    }

使用默认值

    //不给值,默认按照初始值0递增
    enum UserResponse {
      No,
      Yes,
    }

枚举特性

  • 如果设置类型为枚举,则表示该变量只能接收枚举成员,且枚举成员可通过属性查询得到提示
  enum UserResponse {
    No = 0,
    Yes = 1,
  }
   
  function respond1(recipient: string, message: UserResponse): void {
    // ...
  }
   
  //UserResponse.Yes;UserResponse.No
  respond1("Princess Caroline", UserResponse.Yes);
  • 枚举类型支持字符串和数字赋值,不支持布尔值以及复杂数据类型

数字枚举

  • 成员属性值全是数字型
  • 可以用表达式设置。由于枚举有自增特性,如果其中某个成员使用表达式,后面的枚举成员也要使用,否则枚举无法实现自增,报错
function getRandom() {
    return Math.random()
}

enum RandomNum {
    random0,
    random1,
    random2 = getRandom()
}
console.log(RandomNum.random0,RandomNum.random1,RandomNum.random2);  // 0 1 .xxx

字符串枚举

  • 仅用字符串赋值的成员
enum StringEnum {
    stringAAAAAA: 'A',
    stringBBBBBB: 'B',
}

常量枚举

  • 仅可在属性、索引访问表达式、导入声明的右侧、导出分配或类型查询中使用
  const enum Direction {
    up,
    down
  }
  // console.log(Direction); //error
  let dir = [Direction.up];

异构枚举

  • 既有字符串又有数字

反向映射

  • 为某个属性赋属性值,同时将属性值作为属性又赋值其对应的属性名
//类似如下实现
let infactObj = {} as any;
infactObj[infactObj["a"] = 0] = "a" 

枚举和接口的区别

  1. 枚举既有结构,也有值,自增;接口只有类型结构必须赋于具体变量,并具体赋值
  2. 枚举可直接作为对象使用,并且能获得成员提示;而接口定义的类型成员需要先具体化才可被具体化的变量调用,且任意属性具体化后成员提示
//枚举
enum BookList {
    HarryPotter = 1,
    TheLordofRing,
    OneDay
}

//接口
interface ListType0 {
    [prop: string]: number   //任意属性
}
let bookList0: ListType0 = {
    HarryPotter: 1,
    TheLordofRing: 2,
    OneDay: 3
}