
测试开发工具【免费下载链接】ts-jestA Jest transformer with source map support that lets you use Jest to test projects written in TypeScript.项目地址https://gitcode.com/gh_mirrors/ts/ts-jest点击查看免费下载ts-jest 作为在 Jest 中运行 TypeScript 测试的核心转换器其tsconfig选项决定了每次转换使用的 TypeScript 编译器配置来源。本文基于 ts-jest 29.0 版本文档深入讲解该选项的三种取值形式文件路径、内联编译器选项对象、false、默认的自动查找行为并结合仓库源码剖析其底层解析与合并流程帮助你精确控制测试环境的编译行为。tsconfig选项是什么tsconfig是 ts-jest 的转换器配置选项用于定义测试编译时使用哪个 TypeScript 配置文件tsconfigJSON 文件也可以直接内联一个 compiler options 对象来代替文件路径。它通常在 Jest 的transform配置中以第二个数组元素的形式传递给ts-jest。从类型定义看该选项的取值范围在 src/types.ts 中有着明确的声明tsconfig?: boolean | string | RawCompilerOptions | TsConfigCompilerOptionsJson即它支持四种取值形态取值含义string指向某个tsconfigJSON 文件的路径objectRawCompilerOptions/TsConfigCompilerOptionsJson内联的编译器选项对象false禁用自动查找强制使用 TypeScript 默认编译器选项undefined默认启用自动查找行为其中RawCompilerOptions的字段定义可在 src/raw-compiler-options.ts 中查看它覆盖了target、module、moduleResolution、lib、jsx、strict、esModuleInterop、paths、baseUrl等几乎所有 TypeScript 编译器选项与你在tsconfig.json的compilerOptions中能写的字段基本一致。默认行为自动查找tsconfig.json默认情况下即不设置tsconfig选项ts-jest 会在你的项目中查找tsconfig.json文件并使用它。如果项目中没有tsconfig.jsonts-jest 会退回到 TypeScript 的默认编译器选项唯一的例外是target会被设为ES2015而不是 TypeScript 默认的ES5。这一行为不是文档中的孤例在源码 src/legacy/config/config-set.ts 中有明确实现const result this._resolveTsConfig(compilerOptions, resolvedConfigFile) as ts.ParsedCommandLine const { _overriddenCompilerOptions: forcedOptions } this const finalOptions result.options // Target ES2015 output by default (instead of ES3). if (finalOptions.target undefined) { finalOptions.target this.compilerModule.ScriptTarget.ES2015 }更完整的解析流程在_resolveTsConfig方法中config-set.tsts-jest 会通过ts.findConfigFile从项目根目录开始向上查找tsconfig.json读取后使用ts.readConfigFile解析 JSON 内容再调用ts.parseJsonConfigFileContent完成配置合并包括extends继承、baseUrl/paths解析等最后把内联的compilerOptions覆盖到文件配置之上。用法一指定tsconfig文件路径当你的项目有多个tsconfig例如生产构建用的tsconfig.json与测试专用的tsconfig.test.json时可以用字符串形式指定要使用的配置文件。路径必须相对于启动 Jest 时的当前工作目录process.cwd()也可以使用rootDir占位符从项目根目录开始书写。ts-jest 在收到字符串形式的选项后会调用this.resolvePath(tsconfigOpt)进行路径解析见 config-set.tsrootDir由 Jest 展开为根目录绝对路径。以下三种配置文件书写方式效果完全相同分别对应 JS、TS、JSON 形式的 Jest 配置// jest.config.js /** type {import(ts-jest).JestConfigWithTsJest} */ module.exports { // [...] transform: { // ^.\\.[tj]sx?$ to process ts,js,tsx,jsx with ts-jest // ^.\\.m?[tj]sx?$ to process ts,js,tsx,jsx,mts,mjs,mtsx,mjsx with ts-jest ^.\\.tsx?$: [ ts-jest, { tsconfig: tsconfig.test.json, }, ], }, }// jest.config.ts import type { JestConfigWithTsJest } from ts-jest const jestConfig: JestConfigWithTsJest { // [...] transform: { // ^.\\.[tj]sx?$ to process ts,js,tsx,jsx with ts-jest // ^.\\.m?[tj]sx?$ to process ts,js,tsx,jsx,mts,mjs,mtsx,mjsx with ts-jest ^.\\.tsx?$: [ ts-jest, { tsconfig: tsconfig.test.json, }, ], }, } export default jestConfig// package.json { // [...] jest: { transform: { // ^.\\.[tj]sx?$ to process ts,js,tsx,jsx with ts-jest // ^.\\.m?[tj]sx?$ to process ts,js,tsx,jsx,mts,mjs,mtsx,mjsx with ts-jest ^.\\.tsx?$: [ ts-jest, { tsconfig: tsconfig.test.json } ] } } }使用rootDir的写法示例// jest.config.js module.exports { transform: { ^.\\.tsx?$: [ ts-jest, { tsconfig: rootDir/config/tsconfig.test.json, }, ], }, }值得注意的是ts-jest 自带的官方 presets如ts-jest/presets/js-with-ts等在生成配置时默认会引用tsconfig.spec.json详见 src/presets/create-jest-preset.spec.ts 中的断言如果你使用预设并希望覆盖默认的测试配置文件同样需要显式设置tsconfig选项。用法二内联编译器选项对象除了文件路径tsconfig也可以直接接收一个内联的编译器选项对象其结构等同于tsconfig.json中的compilerOptions字段内容。这种方式适合测试环境与构建环境差异较大、且不值得单独维护一个配置文件的小型场景。以下示例只覆盖了importHelpers一个选项其余未设置的选项仍按上述默认规则处理自动查找tsconfig.json并与之合并或回退到 TypeScript 默认值// jest.config.js /** type {import(ts-jest).JestConfigWithTsJest} */ module.exports { // [...] transform: { // ^.\\.[tj]sx?$ to process ts,js,tsx,jsx with ts-jest // ^.\\.m?[tj]sx?$ to process ts,js,tsx,jsx,mts,mjs,mtsx,mjsx with ts-jest ^.\\.tsx?$: [ ts-jest, { tsconfig: { importHelpers: true, }, }, ], }, }// jest.config.ts import type { JestConfigWithTsJest } from ts-jest const jestConfig: JestConfigWithTsJest { // [...] transform: { // ^.\\.[tj]sx?$ to process ts,js,tsx,jsx with ts-jest // ^.\\.m?[tj]sx?$ to process ts,js,tsx,jsx,mts,mjs,mtsx,mjsx with ts-jest ^.\\.tsx?$: [ ts-jest, { tsconfig: { importHelpers: true, }, }, ], }, } export default jestConfig// package.json { // [...] jest: { transform: { // ^.\\.[tj]sx?$ to process ts,js,tsx,jsx with ts-jest // ^.\\.m?[tj]sx?$ to process ts,js,tsx,jsx,mts,mjs,mtsx,mjsx with ts-jest ^.\\.tsx?$: [ ts-jest, { tsconfig: { importHelpers: true } } ] } } }从源码看当tsconfig是对象时config-set.ts会把它作为compilerOptions参数传入并通过展开运算符合并到文件配置之上config-set.tsconfig.compilerOptions { ...config.compilerOptions, ...compilerOptions, }也就是说内联对象中显式声明的选项优先级最高会覆盖tsconfig.json中的同名设置未声明的选项仍继承自文件配置或 TypeScript 默认值。用法三禁用自动查找tsconfig: false如果你希望完全忽略项目中的tsconfig.json、强制使用 TypeScript 默认编译器选项仅target仍按规则替换为ES2015可以将tsconfig设置为false// jest.config.js /** type {import(ts-jest).JestConfigWithTsJest} */ module.exports { // [...] transform: { // ^.\\.[tj]sx?$ to process ts,js,tsx,jsx with ts-jest // ^.\\.m?[tj]sx?$ to process ts,js,tsx,jsx,mts,mjs,mtsx,mjsx with ts-jest ^.\\.tsx?$: [ ts-jest, { tsconfig: false, }, ], }, }// jest.config.ts import type { JestConfigWithTsJest } from ts-jest const jestConfig: JestConfigWithTsJest { // [...] transform: { // ^.\\.[tj]sx?$ to process ts,js,tsx,jsx with ts-jest // ^.\\.m?[tj]sx?$ to process ts,js,tsx,jsx,mts,mjs,mtsx,mjsx with ts-jest ^.\\.tsx?$: [ ts-jest, { tsconfig: false, }, ], }, } export default jestConfig// package.json { // [...] jest: { transform: { // ^.\\.[tj]sx?$ to process ts,js,tsx,jsx with ts-jest // ^.\\.m?[tj]sx?$ to process ts,js,tsx,jsx,mts,mjs,mtsx,mjsx with ts-jest ^.\\.tsx?$: [ ts-jest, { tsconfig: false } ] } } }从解析逻辑看config-set.tsfalse既不是字符串也不是对象因此configFilePath为undefined、内联选项也为undefinedts-jest 仍会调用_resolveTsConfig但此时ts.findConfigFile的查找结果会被刻意忽略最终以 TypeScript 默认选项为基准进行编译。仓库的测试用例 config-set.spec.ts 中即验证了tsconfig: false与stringifyContentPathRegex等选项组合下的行为。源码视角选项解析与缓存机制综合前文tsconfig选项在 ts-jest 中的完整处理链路如下取值分类在 src/legacy/config/config-set.ts 中options.tsconfig被分为三种情况处理字符串 → 通过resolvePath解析为绝对路径作为configFilePath对象 → 作为内联compilerOptions其他false/undefined→ 两者皆为空走默认逻辑。配置查找与合并_resolveTsConfig使用 TypeScript 编译器 API 查找、读取并解析配置文件再把内联选项合并进去config-set.ts。默认值修正_getAndResolveTsConfig中完成三处关键修正target未指定时强制为ES2015config-set.tsmodule未指定时若target是 ES3/ES5 则默认CommonJS否则默认ESNextconfig-set.ts当启用allowJs时自动设置outDirconfig-set.ts。缓存键参与解析后的parsedTsConfig.options与raw会连同编译器版本、babel 配置、诊断配置等一起参与缓存目录的sha1计算config-set.ts。这意味着修改tsconfig选项或tsconfig.json内容后ts-jest 会自动切换新的缓存目录旧缓存不会污染新配置下的测试结果。实践建议优先使用独立的测试配置文件当生产 tsconfig 包含paths、outDir、declaration等对测试无意义甚至有害的选项时单独维护tsconfig.test.json通常继承主配置并覆盖isolatedModules、noEmit等是更清晰的做法此时用路径字符串指向它即可。内联对象适合微调只需覆盖一两个选项如importHelpers、jsx时内联对象最直接注意它会与自动查找到的tsconfig.json合并未覆盖字段仍来自文件。false用于完全脱钩当你的项目 tsconfig 使用了 ts-jest 无法处理的配置如实验性插件或希望测试编译与项目配置彻底解耦时tsconfig: false能让你直接以 TypeScript 默认行为起步。关注模块互操作警告解析配置时若module不是 CommonJS/Node16/NodeNext 且未开启esModuleInterop或allowSyntheticDefaultImportsts-jest 会产生一条配置诊断提示config-set.ts测试环境通常建议保持 CommonJS 模块输出与esModuleInterop。赞分享测试开发工具【免费下载链接】ts-jestA Jest transformer with source map support that lets you use Jest to test projects written in TypeScript.项目地址https://gitcode.com/gh_mirrors/ts/ts-jest点击查看免费下载相关推荐EarcutWebGL应用的终极多边形三角剖分解决方案EarcutWebGL应用的终极多边形三角剖分解决方案 Earcut是一款超轻量级仅3KB gzipped且性能卓越的JavaScript多边形三角剖分库Rolldown tsconfig 选项完全指南自动发现、路径别名与 Transform 优先级解析Rolldown tsconfig 选项完全指南自动发现、路径别名与 Transform 优先级解析 导读 tsconfig 是 Rolldown 顶层配置项构建工具前端构建开发工具Prism Diff Highlight 插件实战让 diff 代码块同时获得 Diff 与目标语言双重高亮Prism Diff Highlight 插件实战让 diff 代码块同时获得 Diff 与目标语言双重高亮 Prism 的 Diff Highlight 插测试开发工具上一篇Apache RocketMQ多语言客户端API文档详细参考下一篇Papermill参数化技术终极指南从简单变量到复杂数据结构的完整教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考