VSCode中Sequelize返回Bluebird类型无法赋值给Promise类型报错如何解决
Sequelize Bluebird 与原生 Promise 类型不兼容报错解决方案
报错根源
两类报错的触发原因一致:Sequelize v5及更早版本默认使用Bluebird作为异步Promise实现,其类型定义和TypeScript默认识别的ES标准Promise类型不匹配,传入仅声明了接收原生Promise入参的
awaitToJs函数时就会触发类型校验失败。
可选用的解决方案
- 方案1:升级Sequelize到v6+版本
Sequelize从v6版本开始已将内置Promise实现更换为原生ES Promise,无需额外配置即可彻底解决类型冲突问题,是最推荐的处理方式。 - 方案2:添加Bluebird类型兼容配置
- 安装Bluebird类型依赖:
npm install @types/bluebird -D - 在
tsconfig.json的compilerOptions配置中加入Bluebird类型声明,让TypeScript全局识别Bluebird类型:
{ "compilerOptions": { "types": ["bluebird"] } }- 给
awaitToJs函数补充Bluebird入参的类型重载,适配两种Promise类型入参:
import type Bluebird from "bluebird"; function awaitToJs<T, E = Error>( promise: Promise<T> | Bluebird<T> ): Promise<[E, null] | [null, T]> { return promise .then((data: T) => [null, data] as const) .catch((err: E) => [err, null] as const); } - 安装Bluebird类型依赖:
- 方案3:临时类型断言规避
不需要修改全局配置的场景下,直接给Sequelize查询方法的返回值断言为原生Promise即可:const [errorDB, responseDB]: any = await awaitToJs( db.Order.findAll({ attributes: ['purchaseOrderNum'], where: { purchaseOrderNum: { [db.Op.or]: shopIds }, }, }) as Promise<any> );
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

