我使用的是带有默认设置的Vite
构建,而const enum
在最终构建中没有内联
示例代码:
// types.ts
export const enum TestConstEnum {
Test1,
Test2,
Test3,
}
// test.ts
import { TestConstEnum } from "./types";
export function test() {
console.log(TestConstEnum.Test1, TestConstEnum.Test2);
}
转运至:
var r = /* @__PURE__ */ ((e) => (e[e.Test1 = 0] = "Test1", e[e.Test2 = 1] = "Test2", e[e.Test3 = 2] = "Test3", e))(r || {});
function t() {
console.log(r.Test1, r.Test2);
}
export {
t as test
};
预期结果:
function t() {
console.log(0, 1);
}
export {
t as test
};
这是默认的tsconfig.json
:
{
"compilerOptions": {
"target": "ESNext",
"useDefineForClassFields": true,
"module": "ESNext",
"lib": ["ESNext", "DOM"],
"moduleResolution": "Node",
"strict": true,
"sourceMap": true,
"resolveJsonModule": true,
"isolatedModules": true,
"esModuleInterop": true,
"noEmit": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noImplicitReturns": true,
"skipLibCheck": true
},
"include": ["src", "lib"]
}
注意,当const enum
没有导入(在同一文件中定义(时,它会按预期进行传输,我也尝试了"isolatedModules": false
相同的结果,
经过大量的谷歌搜索和浪费的半天时间,vite
和大多数现代捆绑器似乎不支持内联const enum
,因为它们的操作方式。
好的一面是,我设法使用define选项使其工作,这不是最漂亮的解决方案,但它完成了任务,您不必重新配置const enums
。
您可以将define
选项添加到vite.config.ts
中,如下所示:
//vite.config.ts
import { defineConfig, UserConfigExport } from "vite";
export default defineConfig(({ command, mode }) => {
const config: UserConfigExport = {
//...the default config
}
if (command === "build")
config.define = {
"TestConstEnum.Test1": 0,
"TestConstEnum.Test2": 1,
"TestConstEnum.Test3": 2,
}
return config;
});