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
相关产品推荐
相关产品推荐

