搜索词
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 保持一致。
2条答案
按热度按时间vwoqyblh1#
反向的常量枚举值是无用的,无法在TS代码中访问,那么我们为什么要发出它们呢?
我的意思是,对于
const enum
来说,这在两个方向上都是百分之百正确的。我们创建了这个标志,因为我们发现手动在调试器中进行反向查找(从值到名称)非常烦人。我必须想象其他人也是出于同样的原因使用它,并且会对这种情况被破坏感到非常烦恼。
epggiuax2#
作为一个使用
preserveConstEnum
和const枚举的用例:在项目中,我们不仅仅使用枚举,因为它们是"庞大的",并且不会内联,所以我们在所有地方都使用const枚举。另一方面,我们提供了一个可以在JS代码中使用的库,所以我们不想破坏他们的代码,并告诉消费者改用魔术常量。这就是为什么我们启用了preserveConstEnum
- 在项目中,我们内联了值,相反地,我们提供了一种在JS代码中使用这些枚举的方法。