使用TypeScript的Jest globalSetup导入模块时.ts扩展名不被识别报错
解决Jest globalSetup导入node_modules时的.ts扩展名错误
问题根源
Jest的globalSetup脚本会直接被Node.js执行,默认不会经过ts-jest的转换流程。当你的testSetup.ts中导入了node_modules内的.ts文件时,Node.js原生无法识别.ts扩展名,因此抛出ERR_UNKNOWN_FILE_EXTENSION错误。而你自己项目内的TS文件能正常导入,是因为测试文件会被ts-jest转换为JS后再执行,不受这个限制。
解决方案
方案1:用ts-node处理globalSetup的TS文件
Node.js本身无法直接运行TS,通过ts-node可以在运行时编译TS文件,解决扩展名问题:
- 安装ts-node依赖:
npm install ts-node --save-dev
- 修改jest.config.js中的
globalSetup配置:
module.exports = { testEnvironment: 'node', roots: ['<rootDir>/test'], testMatch: ['**/*.test.ts'], globalSetup: () => require('ts-node/register').then(() => require('./config/testSetup.ts')), transform: { '^.+\\.tsx?$': 'ts-jest' } };
方案2:提前编译globalSetup文件
如果你已经有TS编译流程(比如用tsc编译到dist目录),可以直接指定编译后的JS文件作为globalSetup:
- 确保你的
testSetup.ts被编译到dist/config/testSetup.js(根据你的tsconfig配置调整路径) - 修改jest.config.js:
module.exports = { // ...其他配置 globalSetup: './dist/config/testSetup.js', // ...其他配置 };
方案3:让ts-jest转换node_modules中的目标模块
如果报错是因为导入的node_modules内的某个模块本身是TS文件,默认Jest会忽略转换node_modules内的文件,你可以通过transformIgnorePatterns指定不忽略该模块,让ts-jest处理它:
module.exports = { // ...其他配置 transformIgnorePatterns: ['/node_modules/(?!需要转换的模块名)/'], // ...其他配置 };
把需要转换的模块名替换成你实际导入的模块名称,这样ts-jest会对该模块进行转换,避免扩展名错误。
额外检查
确保你的tsconfig.json中module字段设置为CommonJS,因为Jest v27默认使用CommonJS模块系统,和TS编译后的模块格式保持一致可以避免额外问题。
内容的提问来源于stack exchange,提问作者Woohaik
相关产品推荐
相关产品推荐

