TypeScript编写Cypress测试遇TS2345类型错误,该错误含义是什么?
"something"无法赋值给Chainable<string> 嘿,这个问题我太熟悉了!咱们先搞懂这个错误到底在说啥,再看怎么修复它。
错误本质是什么?
Cypress的所有命令(包括cy.title())都不是直接返回你想要的实际值,而是返回一个**Chainable<string>类型的命令链对象**。这是Cypress异步执行机制的核心:所有命令都会被加入执行队列,不是立刻执行并返回结果,而是返回一个可以继续链式调用的“容器”。
你现在用assert.strictEqual(cy.title(), 'something'),相当于把一个Cypress命令对象(左边)和普通字符串(右边)做严格相等比较——TypeScript一眼就看出这俩类型完全不匹配,所以抛出了Argument of type '"something"' is not assignable to parameter of type 'Chainable<string>'的错误。
两种修复方法
方法1:用Cypress自带的链式断言(推荐)
Cypress本身就提供了一套贴合异步逻辑的断言方式,直接在命令链后面加.should()就行,完全符合TypeScript的类型要求:
describe('client end to end', function(): void { it('should display correct title in browser', async function(): Promise<void> { cy.title().should('eq', 'something'); }); });
这种写法不仅能通过类型检查,还能完美适配Cypress的异步执行顺序,是官方推荐的写法。
方法2:用.then()提取实际值后断言
如果你一定要用assert.strictEqual这类第三方断言库,得先通过.then()从命令链里取出实际的标题字符串,再做比较:
describe('client end to end', function(): void { it('should display correct title in browser', async function(): Promise<void> { cy.title().then(title => { // 这里title是真正的字符串类型,和"something"匹配 assert.strictEqual(title, 'something'); }); }); });
.then()会在cy.title()执行完成后拿到实际的标题值,此时TypeScript就能识别出title是字符串类型,不会再报错。
额外提醒
这个错误其实是TypeScript帮你提前规避了一个逻辑bug:如果不用链式断言或.then(),直接拿cy.title()去比较,你拿到的根本不是页面标题,而是Cypress的命令对象,就算没有TypeScript报错,你的测试也会失败。
内容的提问来源于stack exchange,提问作者basickarl

