You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NodeJS中跨tsconfig上下文使用枚举作为值的报错问题

错误原因分析

这个错误的核心是ES模块(ESM)与CommonJS(CJS)模块的交互规则差异,结合你的项目结构和配置具体拆解如下:

  1. 后端运行环境是ESM模式
    你的backend配置中,ts-node明确设置了"esm": true,这意味着后端代码会以ES模块的规范来加载和执行。

  2. models模块的编译产物是CommonJS格式
    虽然你在backend里用TypeScript编写,但models目录的代码大概率是编译成了CommonJS模块(要么是models自身的tsconfig没配置为ESM输出,要么是未被编译直接被ts-node当作CJS模块处理)。

  3. 类型导入和值导入的本质区别

    • 当你把Projects枚举当作类型使用时,TypeScript在编译阶段会擦除所有类型相关代码,不会生成运行时的导入逻辑,所以不会触发模块加载的问题,因此类型检查能正常通过。
    • 当你把它当作值使用时,会生成实际的运行时导入代码。而ESM加载CJS模块时,CJS的module.exports会被统一当作ESM的默认导出,而非命名导出。所以你用import { Projects } from '...'这种命名导入的方式,在运行时找不到对应的导出项,就会抛出错误。
  4. 配置的矛盾点
    你的backend tsconfig里开启了esModuleInterop: true和allowSyntheticDefaultImports: true,这两个选项是为了让TypeScript在编译时兼容CJS模块的导入,但ts-node以ESM模式运行时,这些编译时的兼容处理不会作用于运行时的模块加载,所以还是会出现导出不匹配的问题。


内容的提问来源于stack exchange,提问作者mmozedev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 03:32:46