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

152
Vistas
¿Cuál es la diferencia entre estas firmas de funciones en TypeScript?

Actualización: además de la solución a continuación, establecer strictBindCallApply en true para el compilador TS permite que .bind conserve las firmas de funciones, que es la forma más fácil de solucionar este problema.

Estoy trabajando en un código base antiguo que es la definición de callback hell, así que para facilitar las cosas prometo algunos métodos en una clase. Hice un tipo PromiseObject para contener los métodos prometidos, definidos como

 export type PromiseObject = { [fn: string]: (...args: any) => Promise<any> }

Y luego en la clase con la que comencé

 promises: PromiseObject = { fn1: util.promisify(this.fn1) }

Lo cual funcionó muy bien y TypeScript infirió el parámetro y los tipos de retorno para la función prometida. Pero luego tuve un método de un objeto que se crearía durante la ejecución de un método en la clase principal, así que lo prometí así:

 promises: PromiseObject = { fn1: util.promisify(this.fn1) fn2: (provider: IdentityProvider, user: AssertedUser) => util.promisify(provider.getGroups)(user) }

Y TypeScript se quejó porque este fn2 no coincidía con la firma [fn: string]: (...args: any) => Promise<any> . Realmente no entiendo cómo fn1 y fn2 tienen firmas significativamente diferentes; ambos toman ...args: any y ambos devuelven Promise<any> . fn2 solo tiene un paso adicional antes de devolver su promesa. ¿Qué me estoy perdiendo?

ACTUALIZAR TJ Crowder tenía razón, no necesitaba PromiseObject en absoluto, eliminé esa parte y todo funciona.

Después de eliminarlo, también me aseguré de que se vinculara correctamente con lo siguiente (consulte el área de juegos de TS ):

 import * as util from 'util' type AssertedUser = { username: string } type IdProvider = { getGroups: (user: AssertedUser, cb: (err: any, groups: number[]) => void) => void } class MyClass { fn1(arg: string, cb: (err: any, res: string) => void) { cb(null, arg) } private promises = { fn1: this.binder(util.promisify(this.fn1), this), fn2: (user: AssertedUser, provider: IdProvider) => this.binder(util.promisify(provider.getGroups), provider)(user) } private binder<T, U>(promiseFn: (arg: T) => Promise<U>, thisArg: any) { const bound = promiseFn.bind(thisArg) return bound as typeof promiseFn } }
about 4 years ago · Juan Pablo Isaza
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