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:
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
- 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;
