TypeScript下使用Jest与Cypress@10.0.3报Assertion、JestMatchers错误
Cypress@10.0.3 与 Jest 搭配时 Assertion/JestMatchers 类型报错原因
- 全局类型命名空间冲突
Jest和Cypress都会向TypeScript全局作用域注入同名的断言相关类型:Jest默认注入JestMatchers、Assertion类型以及全局expect方法的类型定义,Cypress基于Chai断言体系,同样会在全局声明自己的Assertion类型、重写全局expect的类型。二者的类型声明未做命名空间隔离,TS聚合全局类型时会出现类型结构不兼容的问题,直接抛出类型错误。 - tsconfig 类型加载范围未做隔离
如果项目tsconfig中未明确配置types字段指定需要加载的类型范围,TS会自动扫描加载node_modules下所有可见的类型声明包,会同时载入@types/jest和Cypress内置的类型声明。哪怕Cypress端到端测试、Jest单元测试分目录存放,全局类型依然会跨目录生效,造成两类断言类型互相污染。 - Cypress 10 版本类型挂载逻辑变更
Cypress 10.x 调整了内置类型的默认挂载规则,不再需要手动引入cypress/types/chai等子路径类型文件,安装完成后会自动把Chai相关断言类型挂载到全局,刚好和Jest挂载的全局JestMatchers类型触发合并冲突。比如调用expect(xxx).toBe(xxx)时TS无法判定当前是Jest的expect还是Cypress的expect,就会抛出匹配器属性不存在、类型不匹配的错误。
典型报错特征:写Jest用例时提示
Property 'toBe' does not exist on type 'Assertion',写Cypress断言时提示类型上不存在Jest专属匹配器的对应属性。
内容的提问来源于stack exchange,提问作者Semih Özden
相关产品推荐
相关产品推荐

