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

使用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文件,解决扩展名问题:

  1. 安装ts-node依赖:
npm install ts-node --save-dev
  1. 修改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:

  1. 确保你的testSetup.ts被编译到dist/config/testSetup.js(根据你的tsconfig配置调整路径)
  2. 修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 12:05:13