TypeScript 在枚举类型上会出错吗?
由 Mux 赞助的 DEV 全球展示挑战赛:展示你的项目!
枚举的概念很简单:一个元素可以代表有限数量的不同事物。然而,不同语言的实现方式却大相径庭。一些语言,例如 Rust 和 F#,允许枚举分支作为其他类型的容器。大多数语言会将枚举编译成简单的数字,在编译后的代码中不留任何痕迹。相比之下,TypeScript 的表现就逊色不少。
考虑以下枚举:
enum EnumImplementations {
Rust,
FSharp,
TypeScript,
}
console.log(EnumImplementation.TypeScript);
转译为 JavaScript 将产生以下结果:
var EnumImplementations;
(function (EnumImplementations) {
EnumImplementations[EnumImplementations["Rust"] = 0] = "Rust";
EnumImplementations[EnumImplementations["FSharp"] = 1] = "FSharp";
EnumImplementations[EnumImplementations["TypeScript"] = 2] = "TypeScript";
})(EnumImplementations || (EnumImplementations = {}));
console.log(EnumImplementation.TypeScript);
仅仅为了给三个数字赋予更多意义,就写出了这么多复杂的代码。更糟糕的是,许多摇树优化策略都会保留原样。
我们需要 TypeScript 实际输出的内容(类型定义使用了 JSDoc):
/**
* enum EnumImplementation
* @typedef {(typeof _EnumImplementation_Rust | typeof _EnumImplementation_FSharp | typeof _EnumImplementation_TypeScript)} EnumImplementation
*/
const _EnumImplementation_Rust = 0;
const _EnumImplementation_FSharp = 1;
const _EnumImplementation_TypeScript = 2;
const _EnumImplementation_Keys = ["Rust", "FSharp", "TypeScript"];
console.log(_EnumImplementations_TypeScript);
这样不仅便于进行 tree-shaking,而且也更易读、更简洁。
刚才说了太多,不好意思。你对这个问题有什么看法?
文章来源:https://dev.to/lexlohr/does-typescript-fail-at-enums-hgf免责声明:请不要误会,我真的很喜欢 TypeScript,但这确实是它的一个缺点,让我有点恼火。