Angular 14 集成 Jest 报错:typescript_1.default.canHaveDecorators is not a function
问题分析与解决方案
错误信息
TypeError: typescript_1.default.canHaveDecorators is not a function at TypeScriptReflectionHost.getDecoratorsOfDeclaration (node_modules/jest-preset-angular/build/ngtsc/reflection/src/typescript.js:14:49) at visitNodes (node_modules/typescript/lib/typescript.js:87646:48) at visitLexicalEnvironment (node_modules/typescript/lib/typescript.js:87686:22) at Object.visitEachChild (node_modules/typescript/lib/typescript.js:88234:55) at transformSourceFileOrBundle (node_modules/typescript/lib/typescript.js:88930:57) at transformation (node_modules/typescript/lib/typescript.js:107888:24)
核心原因
你的依赖版本存在兼容性匹配问题,具体为:
ts-jest@29.0.5与jest@28.1.3版本不兼容:ts-jest 29.x仅适配Jest 29.x系列,而你使用的是Jest 28.x,版本错位导致TypeScript相关API调用异常。jest-environment-jsdom@29.3.1同样与Jest 28.x版本不匹配,进一步加剧了测试环境的冲突。
解决方案
1. 调整依赖版本
修改package.json中的devDependencies,将ts-jest和jest-environment-jsdom降级到与Jest 28.x匹配的版本:
"devDependencies": { // 其他依赖保持不变 "jest": "^28.1.3", "jest-environment-jsdom": "^28.1.3", "jest-preset-angular": "^12.2.4", "ts-jest": "^28.0.8" }
2. 重新安装依赖
执行命令清理旧依赖并重新安装:
rm -rf node_modules package-lock.json npm install
3. 可选:调整Jest配置的ESM设置
Angular 14默认使用CommonJS模块系统,当前配置中ts-jest.useESM: true可能引发额外模块解析问题,建议关闭:
globals: { 'ts-jest': { useESM: false, tsconfig: '<rootDir>/tsconfig.spec.json', stringifyContentPathRegex: '\\.(html|svg)$' } },
验证修改
运行测试命令确认问题解决:
npm run test
内容的提问来源于stack exchange,提问作者StefanP
相关产品推荐
相关产品推荐

