ts-jest中Optional Chaining在tsConfig target为ESNext/ES2020/ES2021时不生效问题
问题根因
当你将TS编译target设置为ES2020及更高版本时,TypeScript默认不会对可选链?.、空值合并运算符??等ES2020原生支持的语法做降级转译,会直接保留原生语法输出。如果当前你运行jest的Node.js版本低于14.0.0,Node runtime本身不支持这些ES2020新语法,就会触发运行异常。
而当target设为ES2019时,TS会自动将可选链语法转译为兼容的三元判断表达式,低版本Node也可以正常运行,所以不会报错。
解决方案
- 方案1:升级Node.js版本到14.0.0及以上,Node 14版本已完整支持ES2020全量语法特性,升级后即可正常使用ES2020+的target配置,不需要修改现有编译逻辑。
- 方案2:如果无法升级Node版本,可以保持当前配置,单独在ts-jest的全局配置中将ts编译target指定为ES2019,该配置不会覆盖你项目全局的tsconfig.json设置,仅对jest测试场景生效:
{ // 其余jest配置保持不变 transform: { '^.+\\.(ts|tsx)$': 'ts-jest', }, globals: { 'ts-jest': { tsConfig: { target: 'ES2019', }, }, }, }
- 方案3:如果需要保留ES2020+的target同时兼容低版本Node,可新增babel做二次转译,配置
@babel/preset-env根据当前Node版本自动做语法降级。
快速排查步骤
运行node -v命令查看本地Node.js版本,确认是否低于14.0.0,即可快速验证上述根因是否匹配你的场景。
内容的提问来源于stack exchange,提问作者Santosh
相关产品推荐
相关产品推荐

