什么是 ts-jest 以及为什么需要它?
ts-jest 是流行测试框架 Jest 的一个 TypeScript 预处理器。它允许您运行用 TypeScript 编写的测试,而无需预先编译成 JavaScript。该库在测试执行期间使用内置的 TypeScript 编译器自动将 TypeScript 代码转换为 JavaScript。
ts-jest 的主要目标是实现 TypeScript 与 Jest 的无缝集成。如果没有它,您将不得不在每次运行测试之前手动配置 TypeScript 编译,或者使用像 ts-node 这样的额外工具。ts-jest 使这个过程变得透明且自动化。
使用 ts-jest 的关键优势:
- 自动编译 — TypeScript 文件在测试期间“即时”编译
- 完全支持 TypeScript — 所有语言特性(装饰器、泛型、类型)都能正常工作
- Source maps — 出错时您看到的是原始 TypeScript 代码,而不是编译后的 JavaScript
- 性能 — ts-jest 缓存编译结果,从而加快后续运行速度
- 灵活性 — 您可以通过 Jest 配置来调整 TypeScript 编译器选项
安装 ts-jest
要使用 ts-jest,您需要 Node.js(版本 14 或更高)以及 npm 或 yarn 包管理器。安装只需一条命令:
npm install --save-dev jest typescript ts-jest @types/jest或者通过 yarn:
yarn add --dev jest typescript ts-jest @types/jest包说明:
jest— 测试框架本身typescript— TypeScript 编译器ts-jest— 用于集成的预处理器@types/jest— Jest 的 TypeScript 类型(用于自动补全和类型检查)
安装后,您需要创建或更新 jest.config.js(或 jest.config.ts)文件:
// jest.config.jsmodule.exports = { preset: 'ts-jest', testEnvironment: 'node', roots: ['<rootDir>/src'], testMatch: ['**/__tests__/**/*.ts?(x)', '**/?(*.)+(spec|test).ts?(x)'], moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node']};同时确保在 tsconfig.json 中配置了正确的选项:
{ "compilerOptions": { "target": "ES2020", "module": "commonjs", "strict": true, "esModuleInterop": true, "skipLibCheck": true, "forceConsistentCasingInFileNames": true, "outDir": "./dist", "rootDir": "./src", "declaration": true, "sourceMap": true }, "include": ["src/**/*"], "exclude": ["node_modules", "dist", "**/*.test.ts"]}快速入门及代码示例
让我们创建一个简单的函数及其测试。项目结构:
my-project/├── src/│ ├── math.ts│ └── __tests__/│ └── math.test.ts├── jest.config.js├── tsconfig.json└── package.json文件:src/math.ts
export function add(a: number, b: number): number { return a + b;}
export function subtract(a: number, b: number): number { return a - b;}
export function multiply(a: number, b: number): number { return a * b;}
export function divide(a: number, b: number): number { if (b === 0) { throw new Error('Division by zero'); } return a / b;}文件:src/__tests__/math.test.ts
import { add, subtract, multiply, divide } from '../math';
describe('Math functions', () => { test('adds 1 + 2 to equal 3', () => { expect(add(1, 2)).toBe(3)