与蓝鸟和打字稿的猫鼬承诺

Tho*_*mas 5 mongoose mongodb node.js typescript

我正在使用nodejs/typescript和mongodb数据库开发一个应用程序.要查询数据库,我使用的是mongoose.

我刚刚阅读了mongoose文档中有关如何插入外部promise库的文章,它非常简单:

import mongoose = require("mongoose");
import Promise = require("bluebird");
mongoose.Promise = Promise;
Run Code Online (Sandbox Code Playgroud)

这样做很好.但是我想扩展/覆盖返回的promise的类型.

这是一个函数的例子:

public getModel= () => {
    return MyModel.findOne().exec();
}
Run Code Online (Sandbox Code Playgroud)

这个函数返回一个_mongoose.Promise<MyModel>,我想要返回一只蓝鸟,Promise<MyModel>因为我知道这是一只蓝鸟的承诺.

无论如何都有改变/扩展/覆盖mongoose查询的返回类型?我应该为我的应用编写自定义定义文件吗?任何其他建议将不胜感激.

谢谢 !

小智 5

Promise导出为mongoose中的变量,因此您可以mongoose先将名称空间转换为任何名称,然后再设置Promise为其他名称空间.

  1. 如果你使用qlib.
    • npm install --save q @types/q先安装.tsc版本> = 2.0.
    • 然后加 (<any>mongoose).Promise = Q.Promise;
  2. 使用bluebirdlib,在下面添加代码.
    • import Bluebird = require("bluebird");
    • (<any>mongoose).Promise = Bluebird;


Tho*_*mas 1

mongoose 团队更新了定义文件,您现在可以通过分配MongoosePromise<T>.

为您的应用程序创建一个主.d.ts文件并添加以下内容:

declare module "mongoose" {
    import Bluebird = require("bluebird");
    type MongoosePromise<T> = Bluebird<T>;
}
Run Code Online (Sandbox Code Playgroud)

在您的项目中引用此文件,现在 Mongoose 返回 Bluebird Promise!

这也适用于其他承诺库。

编辑最新的打字版本

declare module "mongoose" {
    import Bluebird = require("bluebird");
    type Promise<T> = Bluebird<T>;
}
Run Code Online (Sandbox Code Playgroud)

请参阅此处的文档