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

i.default is not a constructor:为何同一类在不同文件导入结果不同?

TypeScript Node.js 类导入异常:i.default is not a constructor 问题排查

以下是几种可能导致该问题的原因及排查方向:

  • 导出/导入语法不匹配
    检查product.ts的导出方式与product-price.ts的导入方式是否对应:

    • 若product.ts用默认导出:export default class ProductController {},则导入必须写import ProductController from './product';
    • 若用命名导出:export class ProductController {},则导入必须用import { ProductController } from './product'。
      混用两种语法会直接导致导入结果为undefined,触发构造函数调用报错。
  • 循环依赖问题
    排查product.ts和product-price.ts是否存在循环引用(比如product.ts也导入了product-price.ts中的内容)。循环依赖会导致模块加载时互相等待,其中一方的导出还未完成初始化就被引用,最终出现undefined。
    解决方式可以是重构代码解耦,将公共逻辑抽离为独立模块,或者在函数内部通过动态导入(import('./product'))延迟加载依赖。

  • TypeScript配置异常
    检查tsconfig.json中的关键配置:

    • esModuleInterop若设为false,CommonJS与ES模块的交互会出现兼容问题,默认导出会被包裹为{ default: ... }结构,直接导入会拿到模块对象而非类本身;
    • moduleResolution建议设置为NodeNext或Node16,确保模块解析逻辑与Node.js行为一致。
      尝试将esModuleInterop改为true,重新编译项目验证是否解决问题。
  • 编译产物模块格式冲突
    若项目中同时存在CommonJS和ES模块的编译产物,会导致导入解析异常。比如product.ts被编译为CommonJS格式,而product-price.ts是ES模块,或者反之。
    确认tsconfig.json的outDir目录下所有产物格式统一,同时检查package.json的type字段("type": "module"或"commonjs")与编译配置匹配。

  • 缓存或编译残留问题
    旧的编译产物可能干扰新代码的加载。可以删除编译输出目录(如dist),重新执行tsc编译,同时清理Node.js模块缓存(执行node --clear-module-cache)。

内容的提问来源于stack exchange,提问作者red house 87

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 06:29:56