Jest无法解析TS项目中ESM本地.js导入的解决方法求助
解决ts-jest无法识别
.js导入对应.ts文件的问题 在TypeScript项目中使用.js后缀导入.ts源文件(比如import * from "./b.js")是符合Node.js模块解析规范(尤其是node16/nodenext模块解析模式)的,TypeScript本身能正确识别,但ts-jest默认不会自动把.js导入映射到.ts文件,你可以通过以下几种方式解决:
方案1:使用moduleNameMapper做后缀映射
在你的jest配置文件(jest.config.js或jest.config.ts)中添加moduleNameMapper规则,将.js后缀的导入路径替换为.ts:
module.exports = { preset: 'ts-jest', testEnvironment: 'node', // 映射.js结尾的路径到对应的.ts文件 moduleNameMapper: { '^(\\.\\/.+)\\.js$': '$1.ts' } };
这个正则表达式会匹配所有相对路径的.js导入(比如./b.js),将其转换为./b.ts,让jest能找到对应的TypeScript源文件。
方案2:适配ESM模块项目(如果项目使用type: module)
如果你的项目在package.json中设置了"type": "module",需要使用ESM格式的jest配置,并调整相关参数:
export default { preset: 'ts-jest/presets/default-esm', testEnvironment: 'node', moduleNameMapper: { '^(\\.\\/.+)\\.js$': '$1.ts' }, // 告知jest将.ts文件当作ESM处理 extensionsToTreatAsEsm: ['.ts'], // 优先查找.ts文件 moduleFileExtensions: ['ts', 'js'] };
额外注意事项
- 确保你的
tsconfig.json中moduleResolution设置为node16或nodenext(这也是你能使用.js导入.ts文件的前提); - 如果使用TypeScript的路径别名,需要在
moduleNameMapper中同时配置别名规则,避免冲突。
内容的提问来源于stack exchange,提问作者Willem Mulder
相关产品推荐
相关产品推荐

