繁体   English   中英

Typescript const 枚举替代

[英]Typescript const enum alternative

越来越多的现代 Typescript 转译器已转向按模块转译的策略,这显着提高了构建速度,但消除了跨模块const enum使用的可能性,因为它们的转译需要类型信息。

我有大量const enums ,当它们在没有const提供的内联的情况下使用时:

  1. 由于较长的属性名称,即使在缩小后最终也是数百 KB
  2. 泄漏我不想公开的内部后端属性名称

现在我有这些从后端本机代码自动生成的const enum定义。 举个人为的例子,你可以想象我在 Apple 工作,并且对每个硬件设备都有一个很大的常量枚举。

const enum HardwareType {
    Apple1 = 0,
    // ...
    iPhoneX = 412,
    // ...
    iPhoneUltraXD = 499, // Some theoretical unannounced iPhone
}

如果我只是将const enum HardwareType更改为enum HardwareType ,除了增加我的包大小之外,我现在已经向公众泄露了新的“iPhone Ultra XD”。

我看到像 Terser 这样的东西支持--mangle-props选项,但即便如此似乎在官方文档中也被警告反对并且还意味着创建一个涵盖每个HardwareType的正则表达式? 更不用说这只是我人为的例子,我在现实中有几十个这样的枚举,有数百个值。

我真的很想使用最新的技术进行应用程序捆绑,但是对于常量值的编译时内联真的没有更好的选择吗?

const enum在隐藏原始名称方面不是很安全。 正如您在playground typescript 中看到的那样,编译器在注释中添加了原始名称:

// Input:
const enum Fruites {
    Apple = 1,
    Banana = 2
}

const x = Fruites.Apple
const y = Fruites.Banana

// Output:
"use strict";
const x = 1 /* Apple */;
const y = 2 /* Banana */;

如果您真的想使用最新技术进行应用程序捆绑,并想从 output 文件中隐藏一些秘密名称,请尝试使用esbuild-loaderesbuild本身。 它支持定义选项,允许您在编译时用无意义的值替换一些秘密命名

define: {
  "secrets.hardwareType.iPhoneUltraXD": "499"
}

并安全地使用源代码中定义的值

// Source code: 
if (deviceId === secrets.hardwareType.iPhoneUltraXD) {
// Bundled code:
if(deviceId===499){

define选项可以在 webpack 或带有任何计算值的 esbuild 配置文件中启动(即使需要 json 文件),因此您对编译时定义的数量没有限制。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM