Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

179
Views
Error de Bluebird/mecanografiado: el contexto 'este' de no se puede asignar al método 'esto'

Tengo una serie de métodos (algunos asincrónicos y otros no) que me gustaría usar bluebird.each para procesar en orden. Aquí hay un ejemplo simplificado:

 import bluebird from 'bluebird'; const delay = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms)); class Template { propertyA!: number; propertyB!: number; constructor() {} async methodA() { this.propertyA = 10; console.log({ thisArgInA: this, propertyA: this.propertyA }); await delay(500); return this.propertyA; } methodB() { this.propertyB = this.propertyA * 100; console.log({ thisArgInB: this, propertyB: this.propertyB }); return this.propertyB; } } const instance = new Template(); const sequence = [instance.methodA, instance.methodB]; (async function main() { await bluebird.each(sequence, (fn) => { const result = fn.call(instance); console.log({ result }); }); })();

Esto produce este error que no entiendo:

 index.ts:27:20 - error TS2684: The 'this' context of type '(() => Promise<number>) | (() => number)' is not assignable to method's 'this' of type '(this: Template) => Promise<number>'. Type '() => number' is not assignable to type '(this: Template) => Promise<number>'. Type 'number' is not assignable to type 'Promise<number>'. 27 const result = fn.call(instance);

Pensé que tal vez se deba a que bluebird.each acepta valores o promesas que se resuelven en valores que el compilador no puede conciliar, pero la única solución que se me ocurrió fue escribir fuertemente los valores devueltos"

 async methodA: Promise<number> { /*...*/ } methodB: number { /*...*/ }

Pero eso no cambió nada. También tomo nota de lo siguiente:

  • Tengo que proporcionar contexto aquí, porque al invocar las funciones en each devolución de llamada se pierde la conexión con la Template como this
  • Cuando methodA es síncrono (elimine la palabra clave async , elimine el delay() , simplemente devuelva this.propertyA , esto funciona bien.
  • Cuando elimino las declaraciones de return , las cosas funcionan bien.
  • Cuando cambio fn.call(instance) a fn.bind(instance)() funciona bien

¿Cómo puedo satisfacer al compilador para que sepa cómo llamar a estas funciones con el contexto proporcionado?

¿Hay una manera más fácil de llamar a estos métodos en secuencia para que se mantenga su conexión con this ?

Ejemplo de StackBlitz

about 4 years ago · Juan Pablo Isaza
1 answers
Answer question

0

Puede ser útil observar los tipos inferidos:

  • sequence : (((this: Template) => number) | ((this: Template) => Promise<number>))[] o simplemente ((() => Promise<number>) | (() => number))[]
  • fn : ((this: Template) => number) | ((this: Template) => Promise<number>) o simplemente (() => Promise<number>) | (() => number)
  • .call : <Template, [], number>(this: (this: Template) => number, thisArg: Template): number

y podemos ver que el tipo de la expresión .call() no es lo que esperábamos: el compilador quiere una función que devuelva un number y se queja porque fn alternativamente puede devolver una Promise<number> . Esto probablemente se deba a un error de TypeScript al tratar de inferir el tipo de retorno de los tipos de unión de funciones. Podría estar relacionado con la sutil diferencia entre X => A | B y (X => A) | (X => B) .

Podemos arreglar esto escribiendo

  • const result = fn.call<Template,[],number|Promise<number>>(instance); o
  • …(fn: () => number | Promise<number>)) => … o
  • const sequence : (() => number | Promise<number>)[]
about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!