Ts 🐷🐔

avatar

enum, const enum, declare enum, declare const enum

  • enum
enum Foo1 {X, Y}
console.log(Foo1.Y);
export { Foo1 }

定义一个枚举,编译生成一个查找表

// tsc编译后 - 生成查找表
var Foo1;
(function (Foo1) {
    Foo1[Foo1["X"] = 0] = "X";
    Foo1[Foo1["Y"] = 1] = "Y";
})(Foo1 || (Foo1 = {}));
console.log(Foo1.Y);
export { Foo1 };

// babel编译后 - 生成查找表
var Foo1 = /*#__PURE__*/function (Foo1) {
  Foo1[Foo1["X"] = 0] = "X";
  Foo1[Foo1["Y"] = 1] = "Y";
  return Foo1;
}(Foo1 || {});
console.log(Foo1.Y);
export { Foo1 };
  • const enum
const enum Foo2 { X, Y }
console.log(Foo2.Y);
export { Foo2 }
/**
* "preserveConstEnums": false,
* "isolatedModules": false,
* tsc编译后 - 直接替换,删除查找表
*/
console.log(1 /* Foo2.Y */);
**在其他文件中import { Foo2 },也会被直接替换**

/**
* "preserveConstEnums": true,
* "isolatedModules": false,
* tsc编译后 - 直接替换,但保留查找表
*/
var Foo2;
(function (Foo2) {
    Foo2[Foo2["X"] = 0] = "X";
    Foo2[Foo2["Y"] = 1] = "Y";
})(Foo2 || (Foo2 = {}));
console.log(1 /* Foo2.Y */);
**在其他文件中import { Foo2 },也会被直接替换**

/**
* "preserveConstEnums": true,
* "isolatedModules": true,
* 当设置隔离模块时,preserveConstEnums只能为true,以便供导出使用
* tsc编译后 - 生成查找表
*/
var Foo2;
(function (Foo2) {
    Foo2[Foo2["X"] = 0] = "X";
    Foo2[Foo2["Y"] = 1] = "Y";
})(Foo2 || (Foo2 = {}));
console.log(Foo2.Y); // **不再直接替换
export { Foo2 };

/**
* babel编译后 - 生成查找表,因为babel只能单个文件进行编译,所以行为和设置隔离模块一致
*/
var Foo2 = /*#__PURE__*/function (Foo2) {
  Foo2[Foo2["X"] = 0] = "X";
  Foo2[Foo2["Y"] = 1] = "Y";
  return Foo2;
}(Foo2 || {});
console.log(Foo2.Y);
export { Foo2 };
  • declare enum
declare enum Foo3 {
  X,Y = 2
}
console.log(Foo3.Y);
/** 
* tsc编译后 - 移除声明
*/
console.log(Foo3.Y);

/** 
* babel编译后 - 移除声明
*/
console.log(Foo3.Y);
  • declare const enum
declare const enum Foo4 {
  X,Y = 2
}
console.log(Foo4.Y);
/** 
* "isolatedModules": false,
* tsc编译后 - 移除声明,直接替换
*/
console.log(2 /* Foo4.Y */);

/** 
* "isolatedModules": true,
* Cannot access ambient const enums when 'isolatedModules' is enabled.ts(2748)
* 不允许访问环境const enum,因为隔离模块期望访问Foo4.Y而declare意味着不能有实现,只能使用替换,
* 逻辑上冲突
*/

/** 
* babel 同上
*/

总结就是,当使用babel转化时,enum, const enum相同,decalre enum被移除,不允许declare const enum