En el primer ejemplo, myString tiene el error ts 2322 porque cree que returnString es un número (no lo es). En el segundo ejemplo, si devolvemos explícitamente getNumber(), no hay error ts 2322.
getString() devuelve un valor dentro de su definición. Cypress considerará el sujeto actual como el que se devolvió por última vez o se devolvió explícitamente en la devolución de llamada de una cadena de métodos, que en este caso es myString()
¿Cómo puedo abordar este error sin usar la palabra clave 'return'? Me gustaría usar el estilo del ejemplo 1 pero no quiero resaltar la sintaxis de falso positivo
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') }De los documentos para .then()
Lo que se devuelva desde la función de devolución de llamada se convierte en el nuevo asunto y fluirá hacia el siguiente comando (con la excepción de undefined)
Además, el resultado del último comando de Cypress en la función de devolución de llamada se generará como el nuevo asunto y pasará al siguiente comando si no hay retorno.
No estoy seguro de cómo puede definir ese comportamiento (cambiar de tema si no hay un retorno explícito) al compilador de TypeScript.
Pero para mí, la implicación es que el Sujeto puede tener any tipo.
Escribir el parámetro como tal elimina el mensaje de error.
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 })