核心是用TypeScript编写测试代码来测试JavaScript模块,通过ts-jest桥接实现类型感知:需配置allowJs、checkJs、esModuleInterop,辅以JSDoc或.d.ts声明,并统一使用.test.ts后缀及CommonJS模块适配。

前端工程中 JavaScript 单元测试配合 TypeScript,核心不是“让 JS 代码用 TS 写测试”,而是用 TypeScript 编写测试代码,去测试 JavaScript 模块——同时确保类型安全、IDE 支持和构建流程不中断。这在混合项目(JS 主体 + TS 测试)或渐进迁移中非常常见。
配置 ts-jest 支持 JS 源码的类型感知测试
ts-jest 是关键桥梁,它让 Jest 能解析 TypeScript 测试文件,并在运行前对被测 JavaScript 文件做类型推断(尤其当 checkJs: true 开启时):
- 安装依赖:
npm install --save-dev jest ts-jest @types/jest typescript - 运行
npx ts-jest config:init自动生成jest.config.js,它会自动设好preset: 'ts-jest' - 确保项目根目录有
tsconfig.json,且含以下基础项:"allowJs": true(允许导入 .js 文件)"checkJs": true(对 .js 文件启用类型检查)"esModuleInterop": true(解决 CommonJS/ESM 混合导入问题)
为 JS 模块提供类型提示,让测试更可靠
纯 JS 文件默认无类型信息,但 Jest + ts-jest 能借助 JSDoc 或声明文件识别结构。推荐两种轻量方式:
-
在 JS 源码中加 JSDoc 注解:例如
utils.js中的函数可标注参数和返回值类型,ts-jest 会据此推导,测试里调用时 IDE 就能提示错误 -
为 JS 模块配 .d.ts 声明文件:如
utils.d.ts显式定义export function formatTime(timestamp: number): string;,测试文件 import 后即可获得完整类型校验
测试文件命名与位置规范
保持一致性,避免 Jest 漏扫或类型解析失败:
立即学习“Java免费学习笔记(深入)”;
- 测试文件统一用
.test.ts或.spec.ts后缀(不用 .js),即使被测对象是 JS - 建议与源码同级或集中放
__tests__/目录,如:src/utils.js→ 对应测试写在src/utils.test.ts或__tests__/utils.test.ts - 在
jest.config.js中确认testMatch包含**/*.test.ts和**/*.test.js(如有遗留 JS 测试)
处理模块导入与 CommonJS 兼容性
JS 项目常用 CommonJS(module.exports),而 TS 默认生成 ES Modules。若测试报错 “Cannot redeclare block-scoped variable”,说明模块系统冲突:
- 在
tsconfig.json的compilerOptions中设:"module": "commonjs"(与 JS 运行时一致)"esModuleInterop": true(自动插入__importDefault适配器) - 对使用
require()的 JS 模块,在 TS 测试中可用import * as mod from './xxx.js'或const mod = require('./xxx.js')(需配@types/node)


















