Node 20运行Jest测试时报错Object.groupBy不存在,如何解决?
Object.groupBy在Jest测试中报错:
Property 'groupBy' does not exist on type 'ObjectConstructor' 的原因及修复方案 问题描述
我有一段使用Object.groupBy方法的代码,基于TypeScript 5.5的代码库运行正常。但最近添加测试时,出现错误:Property 'groupBy' does not exist on type 'ObjectConstructor'.
当前配置
Jest配置
"jest": { "moduleFileExtensions": [ "ts", "tsx", "js" ], "transform": { "^.+\\.(ts|tsx|js)$": [ "ts-jest", { "tsconfig": "<rootDir>/tsconfig.json", "isolatedModules": true } ] } }
tsconfig.json配置
{ "compilerOptions": { "target": "ES2018", "module": "commonjs", "strict": true, "declaration": false, "esModuleInterop": true, "noImplicitOverride": true, "lib": [ "ESNext", ] }, "include": [ "src" ] }
报错原因
- 类型定义范围未覆盖测试文件:你的
tsconfig.json中include仅指定了src目录,测试代码(通常在__tests__或test目录)不在该范围内,导致测试文件无法加载lib: ["ESNext"]提供的类型定义——而Object.groupBy是ES2023新增的API,ES2018默认类型定义中不包含它。 - isolatedModules模式的限制:
ts-jest开启了isolatedModules: true,该模式下TypeScript不会处理跨文件的类型依赖,可能导致测试文件无法正确获取全局对象的扩展类型。 - @types/node版本滞后:虽然Node 20原生支持
Object.groupBy,但如果项目中@types/node包版本过低,可能未同步该API的类型定义。
修复方案
方案1:扩展tsconfig的include范围
修改tsconfig.json,将测试目录加入include:{ "include": [ "src", "__tests__", // 替换为你的实际测试目录名,比如"test" "**/*.test.ts" // 也可直接匹配所有测试文件 ] }方案2:为测试单独配置tsconfig
若不想修改主配置,可创建tsconfig.test.json:{ "extends": "./tsconfig.json", "include": [ "src", "__tests__" ] }然后修改Jest配置中的
tsconfig路径:"transform": { "^.+\\.(ts|tsx|js)$": [ "ts-jest", { "tsconfig": "<rootDir>/tsconfig.test.json", "isolatedModules": true } ] }方案3:更新@types/node包
确保安装的@types/node版本适配Node 20,执行命令:npm install @types/node@latest --save-dev方案4:手动添加类型声明
若上述方案无效,可在项目根目录创建global.d.ts文件,手动补充类型:interface ObjectConstructor { groupBy<T, K extends PropertyKey>( items: Iterable<T>, callbackfn: (item: T, index: number) => K ): Record<K, T[]>; }同时确保该文件被tsconfig的
include覆盖。
内容的提问来源于stack exchange,提问作者heapOverflow
相关产品推荐
相关产品推荐

