Búsqueda de sitios web

javascript - Promesa ES6/Typescript y la promesa Bluebird


Tengo un proyecto de nodejs/typescript 2 y uso el paquete es6-promise. Ahora me gustaría deshacerme del paquete extra porque puedo apuntar a ES6 directamente en typescript.

Así que eliminé el paquete es6-promise y cambié el tsconfig.json para apuntar a es6.

{
  "compilerOptions": {
    "target": "es6",
    // ...
  }
}

Muchos paquetes de terceros usan la promesa Bluebird, pero la definición de la promesa es incompatible con la promesa es6 por defecto, como se indica en diferentes publicaciones en GitHub

  • la definición de bluebird 3.0 no se puede asignar a las Promesas de ES6
  • Proporciona una forma de cargar Bluebird globalmente en el objetivo de compilación es6.
  • Agregar Symbol.toStringTag a la instancia de promesa

Entonces estoy recibiendo el siguiente error.

TS2322: El tipo 'Bluebird' no se puede asignar al tipo 'Promise'. Falta la propiedad '[Symbol.toStringTag]' en el tipo 'Bluebird'.

Hay otro paquete de tipos en npm @types/bluebird-global. En uno de los posts del blog, un usuario sugiere usarlo en lugar de @types/bluebird, pero algunos paquetes de terceros (por ejemplo, los typings de sequelize) hacen referencia a bluebird y no a bluebird-global, por lo que obtengo otro error por la falta de typings de bluebird.

¿Cuál es una buena solución para que esto funcione?

Respuesta #1

Estaba tratando con

TS2322: El tipo 'Bluebird' no se puede asignar al tipo 'Promise'. Falta la propiedad '[Symbol.toStringTag]' en el tipo 'Bluebird'.

y encontré este hilo: https://github.com/DefinitelyTyped/DefinitelyTyped/issues/10801

La versión TL;DR; de esto es hacer una de las siguientes cosas:

  1. En cada uno de tus archivos de entrada .ts, agrega lo siguiente para sobrescribir la promesa global:

    import * as Bluebird from 'bluebird';
    declare global { export interface Promise<T> extends Bluebird<T> {} }

O

  1. envuelve todas las promesas en un constructor de promesas de Bluebird. Hay cierta sobrecarga en tiempo de ejecución aquí y se menciona como un anti patrón en el sitio de Bluebird.

Como comentario aparte, no pude hacer que la segunda opción funcionara, pero la primera funcionó bien para mí.

Respuesta #2

Dado que no hay [Symbol.toStringTag] en Bluebird, en efecto es incompatible. Hay otras cosas que diferencian la implementación de Bluebird de la Promise nativa: el programador de tareas, el manejo de errores... La forma correcta de manejar esto es:

const promise: Promise<type> = Promise.resolve<type>(bluebirdPromise);

Si la compatibilidad en tiempo de ejecución no es un problema seguro, esto se puede abordar con conversión de tipos únicamente de manera relativamente segura para los tipos:

const promise: Promise<type> = <Promise<type>><any><Bluebird<type>>bluebirdPromise;

o

const promise: Promise<type> = <Promise<type>><PromiseLike<type>>bluebirdPromise;

Artículos relacionados