You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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"
    ]
}

报错原因

  1. 类型定义范围未覆盖测试文件:你的tsconfig.json中include仅指定了src目录,测试代码(通常在__tests__或test目录)不在该范围内,导致测试文件无法加载lib: ["ESNext"]提供的类型定义——而Object.groupBy是ES2023新增的API,ES2018默认类型定义中不包含它。
  2. isolatedModules模式的限制:ts-jest开启了isolatedModules: true,该模式下TypeScript不会处理跨文件的类型依赖,可能导致测试文件无法正确获取全局对象的扩展类型。
  3. @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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 19:07:14