Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

182
Vistas
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 Respuestas
Responde la pregunta

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 Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda