TypeScript中如何将Jest全局类型限定作用于特定文件
@types/jest 作用域限制与非全局导入配置方案
让@types/jest仅对.jest.ts后缀文件生效
TypeScript 默认会自动加载 node_modules/@types/ 下所有包的类型到全局,这是安装@types/jest后所有.ts文件都能识别Jest全局变量的核心原因,可以通过以下两种方式调整生效范围:
- 方案一(推荐):拆分TS配置,区分业务代码与测试代码
- 修改项目根目录给业务源码使用的
tsconfig.json,显式指定业务侧需要的全局类型,排除Jest,同时排除测试文件的匹配范围:{ "compilerOptions": { // 其余业务配置保持不变 "types": ["node"] // 仅填写业务代码需要的全局类型,不要加入jest }, "include": ["src/**/*.ts"], "exclude": ["src/**/*.jest.ts"] } - 新建测试专用的
tsconfig.test.json,继承基础配置,单独给测试文件引入Jest类型:{ "extends": "./tsconfig.json", "compilerOptions": { "types": ["node", "jest"] // 仅测试环境加载jest类型 }, "include": ["src/**/*.jest.ts"] }
ts-jest跑测试,记得在jest配置里指定ts-jest读取测试专用的tsconfig,避免运行时报错:// jest.config.js module.exports = { transform: { '^.+\\.tsx?$': ['ts-jest', { tsconfig: './tsconfig.test.json' }] } } - 修改项目根目录给业务源码使用的
- 方案二:测试文件手动引入类型引用
如果不想维护多份TS配置,可以直接在基础tsconfig.json的types数组中排除jest,之后在每一个.jest.ts测试文件顶部添加三斜线指令,手动引入Jest类型:
这种方式不需要拆分配置,但每个测试文件都要手动加一行引用,适合测试文件规模较小的项目。/// <reference types="jest" /> // 后续编写测试逻辑
配置为必须通过import导入Jest函数,不使用全局变量
完全可以实现,配置步骤如下:
- 安装Jest官方提供的模块化导入包:
npm i -D @jest/globals - 在测试专用的TS配置中,不要把
jest加入compilerOptions.types数组,避免全局注入Jest类型。 - 在Jest配置文件中关闭全局变量注入,从运行时层面禁用全局API:
// jest.config.js module.exports = { // 其余配置保持不变 injectGlobals: false } - 之后所有测试文件里用到Jest方法都必须显式导入,TS会对未导入的用法直接报错:
import { describe, test, expect, beforeEach, afterAll } from '@jest/globals'; test('1+1计算结果正确', () => { expect(1 + 1).toBe(2); });
内容的提问来源于stack exchange,提问作者Nathan Wall
相关产品推荐
相关产品推荐

