枚举是什么?
是用来组织一组有关系的数据的方式。
常见Demo如下:
1 2 3 4 5 6
   | enum Days {Sun, Mon, ...}; let sun:Days.Sun = 0; enum Sex {male, female}
  enum Age {0, 1, 2, ...}
 
  | 
 
Enum 默认和数字类型兼容
1 2 3 4 5 6 7 8
   | enum Days {   Sun,   Mon, } let sun: Days.Sun = '0'; 		^__ error 不能将类型“"0"”分配给类型“Days.Sun”。ts(2322) let sun: Days.Sun = 0;  let mon: Days.Mon = 2; 
  | 
 
**如何 修改 Enum 的值 **(Enum 的灵活)
修改默认初始值为某一整型,后续则 ++ 递增。且只有为nu
1 2 3 4 5 6 7 8 9 10
   | enum Days {   Sun = 7,   Mon,  }
  enum Days {   Sun,   Mon = 2,    Tue  }
  | 
 
 
任意修改,可以任意修改数值,但个人觉得没啥意义且有少许风险。
 
可以修改值为字符串类型
 
Enum 和字符型类型兼容
可以手动修改enum 的值为字符型,但是需要注意的是,字符类型无法推断,所以当修改为字符型时需要对每一个值添加类型。不然的话ts 会报错。
1 2 3 4 5 6 7 8
   | enum Days {   Sun = "3",   Mon = "4",   Tue, 
    Wed,
  }
  | 
 
常量枚举
enum 可以加const 进行修饰,目的是为了编译后的性能提升。具体事例如下。
1 2 3 4 5 6 7 8 9 10
   | const enum Tristate {   False,   True,   Unknown }
  const lie = Tristate.False;
 
  let lie = 0;
  | 
 
对于真实的JS代码来说,enum本身要么编译成对象, 要么编译无。对于 常量枚举,Tristate.False 完全可以编译成 0(Tristate.False 的实际值) ,这个时候声明枚举的这一部分,完全可以拿掉。所以最终结果就是 *let lie = 0;*。- 这种编译方式称为内联模式。
当然这个是TS 默认实现,如果不想要这个移除,可以在tsconfig里进行配置 preserveConstEnums: false。
1 2 3 4 5
   | "compilerOptions": {   { 	  "preserveConstEnums": false   } }
  | 
 
- enum 外部枚举(通过declare 声明) 编译后结果会擦除枚举的定义,谨慎使用
 
1 2 3 4 5 6 7 8 9
   | declare enum D {   Up, } let d : D = D.Up; console.log("d", d);
  ---------- tsc 编译后 ---------- let d = D.Up; console.log("d", d);  
  | 
 
Enum 的真实数值
 对于实际成JS编译后的值,还是数字
1 2 3 4 5 6 7 8 9 10 11 12 13 14
   | let today : Days = Days.Sun; 
  enum Tristate {   False,   True,   Unknown }
  var Tristate; (function(Tristate) {   Tristate[(Tristate['False'] = 0)] = 'False';   Tristate[(Tristate['True'] = 1)] = 'True';   Tristate[(Tristate['Unknown'] = 2)] = 'Unknown'; })(Tristate || (Tristate = {}));
   | 
 
	
Enum 的能力 双向映射
Enum 的值默认从 0 开始。
1 2 3 4 5 6 7 8 9 10
   | 01  enum Days {Sun, Mon, Tue, Wed, Thu, Fri, Sat}; 02  console.log(Days["Sun"] === 0);              03  console.log(Days["Mon"] === 1);              04  console.log(Days["Tue"] === 2);              05  console.log(Days["Wed"] === 3);              06  console.log(Days["Sat"] === 6);              07  console.log(Days[0] === "Sun");              08  console.log(Days[1] === "Mon");              09  console.log(Days[2] === "Tue");              10  console.log(Days[6] === "Sat");             
  | 
 
有静态方法的枚举
通过命名空间的形式给该枚举添加方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14
   | enum Days {   Sun,   Mon,   Tue,   Wed, }
  namespace Days {   export function isWeekNumber(d: Days): string {     return Days[d];   } }
  console.log(Days.isWeekNumber(1));
  |