使用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
相关产品推荐
相关产品推荐

