在方法链的回调中未显式返回导致编译器错误地推断当前主题



在第一个示例中,myString有一个2322错误,因为它认为returnedString是一个数字(它不是)。在第二个示例中,如果显式返回getNumber(),则不会出现ts 2322错误。

getString()返回其定义内的值。Cypress将把当前主题视为方法链回调中最后返回或显式返回的主题,在本例中是myString()

不使用'return'关键字如何解决此错误?我想使用示例1的样式,但不希望误报语法高亮显示

describe('example with error', () => {
it('example with error', () => {
getNumber()
.then((returnedNumber) => {
getString()
})
.then((returnedString) => {
const myString: string = returnedString // <-- HERE: "Type 'number' is not assignable to type 'string'. ts(2322)"
expect(myString).to.equal('string') // true
})
})
it('example without error', () => {
getNumber()
.then((returnedNumber) => {
return getString() // <-- HERE: explicitly returning
})
.then((returnedString) => {
const myString: string = returnedString
expect(myString).to.equal('string') // true
})
})
})
function getNumber(): Cypress.Chainable<number> {
return cy.wrap(1)
}
function getString(): Cypress.Chainable<string> {
return cy.wrap('string')
}

From docs for.then()

从回调函数返回的任何内容都将成为新的主题,并将流向下一个命令(undefined除外)

此外,回调函数中最后一个Cypress命令的结果将作为新主题产生。,如果没有返回,则流到下一个命令。

我不确定如何将这种行为(如果没有显式返回,则切换主题)定义给Typescript编译器。

但对我来说,这意味着Subject可以具有类型any

这样输入参数将删除错误消息

getNumber()
.then(() => {
getString()   // Typescript can't infer Subject will be string 
// just because there's no return
})
.then((returnedString: any) => {
const myString: string = returnedString // no error
})

最新更新