Vite Typescript-const枚举未内联



我使用的是带有默认设置的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;
});

最新更新