蓝鸟和打字稿

时间:2016-07-19 04:35:33

标签: node.js mongodb typescript mongoose

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

我刚刚阅读了how to plug in an external promise library上的mongoose文档中的一篇文章,这很简单:

import mongoose = require("mongoose");
import Promise = require("bluebird");
mongoose.Promise = Promise;

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

以下是一个函数示例:

public getModel= () => {
    return MyModel.findOne().exec();
}

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

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

谢谢!

4 个答案:

答案 0 :(得分:5)

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

  1. 如果您使用的是q lib。
    • 首先安装npm install --save q @types/qtsc版本&gt; = 2.0。
    • 然后添加(<any>mongoose).Promise = Q.Promise;
  2. 使用bluebird lib,在下面添加代码。
    • import Bluebird = require("bluebird");
    • (<any>mongoose).Promise = Bluebird;

答案 1 :(得分:1)

  

我应该为我的应用编写自定义定义文件

是。它主要是在猫鼬定义中找到并取代Promise。

答案 2 :(得分:1)

mongoose团队更新了定义文件,您现在可以通过分配MongoosePromise<T>来插入并使用您自己的promise库。

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

declare module "mongoose" {
    import Bluebird = require("bluebird");
    type MongoosePromise<T> = Bluebird<T>;
}

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

这也适用于其他承诺库。

编辑最新的打字版本

declare module "mongoose" {
    import Bluebird = require("bluebird");
    type Promise<T> = Bluebird<T>;
}

请参阅文档here

答案 3 :(得分:0)

在撰写本文时,如果您使用typings install mongoose安装打字,则会在已安装的打字文件中there is an open issue。具体typings file that is loaded导入mpromise,导入语句会导致包含完整的mpromise module definition文件并包含在您的typings\modules\mongoose\index.d.ts文件中。

在此问题得到解决之前,我的解决方法是删除~mongoose~mpromise的模块定义并替换index.d.ts文件中的以下行:

import * as Promise from '~mongoose~mpromise';

这一个:

import Promise = require( "bluebird");

这无疑是一个临时的止损,因为对typings install mongoose的另一次调用会恢复此修复。对于好奇,我当前的设置包括:typings(版本2.0.0),npm(3.10.9)和节点(v6.9.2)