跳转至

enum

enum 的使用场景

enum 枚举常被用来为各种标志位设置语义提示,比如:

当后端返回的 json 数据中有一个字段 status, 该字段通过不同的整数取值表示不同的状态时, 便可考虑使用 enum 来为这些取值设置语义:

enum Status {
  // 为任意元素设置初始值后,ts会自动为后续元素设置递增后的值
  todo = 0,
  done,
  archived,
  deleted,
}

interface R {
  name: string;
  status: Status;
}

let file: R = {
  name: 'temp',
  status: Status.archived,
};

console.log(file.status);   // 2

此外,enum 也可以用作前端的权限控制

enum Permission {
  None = 0, // 0000
  Read = 1 << 0, // 0001
  Write = 1 << 1, // 0010
  Delete = 1 << 2, // 0100
  Manage = Read | Write | Delete, // 0111
}

type User = {
  permission: Permission;
};

const user = {
  // 0b 代表二进制
  permission: 0b0111,
};

// 权限判断
if (canWrite(user.permission)) {
  console.log('用户具有写权限');
}
if (canManage(user.permission)) {
  console.log('用户具有管理权限');
}

function canWrite(permission: Permission): boolean {
  return (permission & Permission.Write) === Permission.Write;
}

function canManage(permission: Permission): boolean {
  return (user.permission & Permission.Manage) === Permission.Manage;
}

不应使用 enum 的情况

当选项本身边存在语义的时候不应使用 enum,而应该直接使用 type 定义集合

enum Fruit {
  apple = 'apple',
  banana = 'banana',
  pineapple = 'pineapple',
  watermelon = 'watermelon',
}

let f: Fruit = Fruit.apple;
f = Fruit.watermelon;
console.log(f);

以上例子中,因为 Fruit 中的选项所代表的值本身就有便于理解的完整语义, 因此再使用 enum 就会显得多此一举

由于 typescript 的数据类型本质上是一种值的集合, 所以上述代码可以直接改成以下形式:

type Fruit = 'apple' | 'banana' | 'pineapple' | 'watermelon';

let f: Fruit = 'apple';
f = 'watermelon';
console.log(f);