TypeScript导入类时出现Cannot find module错误的问题咨询
TypeScript导入无后缀报错的原因与解决方法
问题根因
你遇到的问题是ES模块规则和TypeScript默认配置的冲突:
- 你的package.json里设置了
"type": "module",这意味着项目使用Node.js的ES模块规范,而ES模块要求导入必须指定完整的文件后缀(比如.js)。 - 你在
index.ts里写的import {User} from "./User",TypeScript默认编译时不会自动给导入路径添加.js后缀,导致编译后的dist/index.js里仍然是import {User} from "./User"。Node.js执行时找不到无后缀的./User文件(实际存在的是User.js),因此抛出"Cannot find module"错误。
解决方法
方法1:调整TypeScript模块配置(推荐)
修改tsconfig.json中的module和moduleResolution为node16或nodenext,这是TypeScript为Node.js ES模块量身设计的解析模式,会自动处理后缀转换:
{ "compilerOptions": { "rootDirs": ["src"], "outDir": "dist", "lib": ["es2020"], "target": "esnext", "module": "node16", // 替换为node16或nodenext "moduleResolution": "node16", // 同步修改此处 "esModuleInterop": true, "types": ["node"] } }
修改后,你在.ts文件中无需添加后缀,TypeScript编译时会自动将./User转换为./User.js,Node.js就能正确识别文件。
方法2:手动添加.js后缀(临时方案)
在index.ts的导入语句中直接添加.js后缀:
import {User} from "./User.js";
TypeScript会自动识别该路径指向User.ts文件,编译后路径保持为./User.js,Node.js可正常执行。但这种写法不符合TypeScript的常规习惯,仅适合临时测试。
为什么教程里没提?
多数旧教程使用的是CommonJS模块规范(package.json未设置"type": "module"),CommonJS允许省略文件后缀,因此无需添加。而现在ES模块是主流规范,新项目普遍启用"type": "module",这就需要遵循Node.js的严格规则。
内容的提问来源于stack exchange,提问作者hantoren
相关产品推荐
相关产品推荐

