簡體   English   中英

與藍鳥和打字稿的貓鼬承諾

[英]Mongoose Promise with bluebird and typescript

我正在使用nodejs / typescript和mongodb數據庫開發一個應用程序。 要查詢數據庫,我使用的是mongoose

我剛剛閱讀了mongoose文檔中有關如何插入外部promise庫的文章 ,它非常簡單:

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

這樣做很好。 但是我想擴展/覆蓋返回的promise的類型。

這是一個函數的例子:

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

這個函數返回一個_mongoose.Promise<MyModel> ,我想返回一個藍鳥Promise<MyModel>因為我知道這是一個藍鳥的承諾。

無論如何都有改變/擴展/覆蓋mongoose查詢的返回類型? 我應該為我的應用編寫自定義定義文件嗎? 任何其他建議將不勝感激。

謝謝 !

Promise導出為mongoose中的變量,因此您可以將mongoose名稱空間轉換為任何名稱,然后將Promise設置為其他名稱空間。

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

我應該為我的應用程序編寫自定義定義文件

是。 它主要是在貓鼬定義中找到並取代Promise。

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

請參閱此處的文檔

在撰寫本文時,如果您使用typings install mongoose來安裝打字, 那么在打包文件中會出現一個未解決的問題 特定的打包文件,加載導入mpromise ,導入語句導致包含完整的mpromise模塊定義文件的打字 ,並包含在您的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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM