TypeScript Don't emit const enums with reverse mapping (under preserveConstEnum)

e3bfsja2  于 4个月前  发布在  TypeScript
关注(0)|答案(2)|浏览(67)

搜索词

preserveConstEnums, const enum, enum

建议

默认情况下,所有 const enum 都会保留输出。const enum 的关键区别之一是不允许查找反向值:

enum Enum {
  Zero,
  One,
}

console.log(Enum[1]); // allowed, result is 'One'

const enum ConstEnum {
  Zero,
  One,
}

console.log(ConstEnum[1]); // Error

这意味着即使启用了 preserveConstEnums 标志,我们也无法访问 const enum 的 "reversed" 成员。
const enum 的 JS 代码与仅包含 enum 的代码非常相似,目前它包含字符串字面量(尽管它们无法从代码中访问):

var ConstEnum;
(function (ConstEnum) {
    ConstEnum[ConstEnum["Zero"] = 0] = "Zero";
    ConstEnum[ConstEnum["One"] = 1] = "One";
})(ConstEnum || (ConstEnum = {}));

我的功能请求是在启用 preserveConstEnums 时更改 const enum 的输出并从中删除 "reversed" 值:

var ConstEnum;
(function (ConstEnum) {
    ConstEnum["Zero"] = 0;
    ConstEnum["One"] = 1;
})(ConstEnum || (ConstEnum = {}));

注意:实际上,如果为每个 const enum 的成员指定字符串常量值,tsc 已经具有类似的行为,但值是字符串而不是数字 - 如果您的 const enum 用于声明字符串常量,这是一种解决方法。

用例

对于 const enum 的反向值没有用处,无法在 TS 代码中访问,那么为什么要发出它们呢?🤔 我猜在这种情况下,const enum 的行为将与类型和执行(JS)目的相同。

检查清单

我的建议满足以下准则:

  • 这不会对现有的 TypeScript/JavaScript 代码造成破坏性更改
  • 这不会改变现有 JavaScript 代码的运行时行为
  • 这可以在不根据表达式的类型发出不同的 JS 的情况下实现
  • 这不是一个运行时特性(例如库功能、JavaScript 输出中的非 ECMAScript 语法等)
  • 这个特性将与其他 TypeScript's Design Goals 保持一致。
vwoqyblh

vwoqyblh1#

反向的常量枚举值是无用的,无法在TS代码中访问,那么我们为什么要发出它们呢?
我的意思是,对于const enum来说,这在两个方向上都是百分之百正确的。
我们创建了这个标志,因为我们发现手动在调试器中进行反向查找(从值到名称)非常烦人。我必须想象其他人也是出于同样的原因使用它,并且会对这种情况被破坏感到非常烦恼。

epggiuax

epggiuax2#

作为一个使用preserveConstEnum和const枚举的用例:在项目中,我们不仅仅使用枚举,因为它们是"庞大的",并且不会内联,所以我们在所有地方都使用const枚举。另一方面,我们提供了一个可以在JS代码中使用的库,所以我们不想破坏他们的代码,并告诉消费者改用魔术常量。这就是为什么我们启用了preserveConstEnum - 在项目中,我们内联了值,相反地,我们提供了一种在JS代码中使用这些枚举的方法。

相关问题