如何仅为单元测试文件声明TypeScript全局变量?
如何仅为单元测试文件扩展TypeScript全局变量
当然可以实现,核心思路是通过TypeScript配置的环境隔离,让测试专属的全局变量声明只在测试代码的编译流程中生效,不会影响生产环境代码。下面是两种可靠的实现方式:
方法一:测试目录专属类型声明
- 创建测试专属的类型声明文件
在你的测试根目录(比如__tests__)下新建一个global.d.ts文件,写入全局变量声明:
declare global { var foo: Bar; } export {}; // 必须添加这一行,将文件标记为ES模块,否则无法正确扩展全局类型
- 配置测试专用的TypeScript配置文件
新建tsconfig.test.json,继承主配置并指定测试相关文件的范围:
{ "extends": "./tsconfig.json", "include": ["__tests__/**/*", "src/**/*.test.ts"], // 包含所有测试文件 "exclude": [] // 覆盖主配置的排除规则,确保测试文件被正确编译 }
- 让测试框架使用该配置
在Jest配置文件(比如jest.config.js)中指定使用测试专用的TS配置:
module.exports = { preset: 'ts-jest', globals: { 'ts-jest': { tsconfig: 'tsconfig.test.json' } } };
- 确保主配置排除测试文件
在主tsconfig.json中添加排除规则,避免生产环境加载测试类型声明:
{ "exclude": ["__tests__", "src/**/*.test.ts"] }
方法二:通过文件扩展名精准匹配
如果你的测试文件都统一使用.test.ts后缀,可以直接在主TS配置中为这类文件单独指定类型声明:
- 在项目根目录下创建
test-types文件夹,里面放global.d.ts(内容同方法一) - 修改主
tsconfig.json,针对测试文件单独配置类型包含:
{ "include": ["src/**/*"], "exclude": ["src/**/*.test.ts"], "compilerOptions": { // 主配置选项 }, "files": [], "references": [ { "path": "./tsconfig.test.json" } ] }
然后tsconfig.test.json的配置和方法一一致,专门处理.test.ts文件的编译和类型加载。
这样设置后,只有测试文件能识别global.foo变量,生产环境代码中访问该变量会直接触发TypeScript类型错误,符合你的需求。
内容的提问来源于stack exchange,提问作者Lehks
相关产品推荐
相关产品推荐

