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

使用TypeScript和Jest实现i18n时遇TS1208模块错误求助

解决TypeScript + Jest Mock react-i18next时的TS1208错误

这个错误的核心原因很明确:当启用--isolatedModules标志时,TypeScript要求所有文件必须是ES模块——也就是文件里必须包含至少一个import或export语句。你的mock文件目前只有jest.mock(...)调用,没有任何导出,所以被TypeScript判定为普通脚本而非模块,触发了TS1208错误。

下面是分步解决方案:

1. 将Mock文件转为ES模块

在你的__tests__/__mock__/react-i18next.ts文件末尾添加一个空导出,让TypeScript识别它为模块:

jest.mock('i18next', () => ({ 
  use: () => { return { init: () => { } }; }, 
  t: k => k 
}));

// 添加这行,将文件转为ES模块
export {};

2. 完善react-i18next的Mock实现

你的当前mock只覆盖了i18next核心库的部分方法,但react-i18next还提供了useTranslation等常用hooks,测试组件时如果用到这些hooks会报错。建议把这些也模拟出来:

import { jest } from '@jest/globals';

// 模拟i18next核心库
jest.mock('i18next', () => ({
  use: () => ({
    init: jest.fn(), // 用jest.fn()方便后续测试中验证调用
  }),
  t: (key: string) => key,
  changeLanguage: jest.fn(),
}));

// 模拟react-i18next的useTranslation hook
export const useTranslation = () => ({
  t: (key: string) => key,
  i18n: {
    changeLanguage: jest.fn(),
  },
});

// 模拟react-i18next的Trans组件(如果测试中用到的话)
export const Trans = ({ children }: { children: React.ReactNode }) => children;

// 空导出标记为模块
export {};

3. 修正Jest配置中的正则表达式

注意你的testRegex里的反斜杠需要转义,否则正则无法正确匹配文件:

module.exports = { 
  verbose: true, 
  roots: ["<rootDir>"], 
  testRegex: "/__tests__/.*\\.(test|spec)\\.tsx?$", // 这里的\\是转义后的反斜杠
  transform: { 
    "^.+\\.tsx?$": "ts-jest", 
  }, 
  moduleNameMapper: { 
    "react-i18next": "<rootDir>/__tests__/__mock__/react-i18next.ts" 
  },
  // 可选:如果还有其他TS诊断问题,可以在这里调整
  globals: {
    "ts-jest": {
      diagnostics: {
        // 不建议忽略错误,但如果临时需要可以添加
        // ignoreCodes: [1208]
      }
    }
  }
};

验证方案

做完以上修改后,重新运行测试,TS1208错误应该会消失。同时你的组件测试中调用useTranslation或t函数时,会使用你mock的实现,不会再依赖真实的i18n配置。

内容的提问来源于stack exchange,提问作者lost9123193

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 11:17:49