2017-03-09 110 views
8

我有一個nodejs/typescript 2項目並使用es6-promise包。 現在我想擺脫額外的包,因爲我可以直接針對打字稿中的ES6。ES6承諾/打字稿和藍鳥承諾

因此,我刪除了es6-promise軟件包,並將tsconfig.json更改爲es6目標。

{ 
    "compilerOptions": { 
    "target": "es6", 
    // ... 
    } 
} 

許多第三方軟件包使用藍鳥承諾,但承諾的定義是不兼容的默認ES6承諾如在github

S o我收到以下錯誤。

TS2322:類型'藍鳥'不可分配鍵入'承諾'。屬性'[Symbol.toStringTag]'在'Bluebird'類型中缺失。

在npm @types/bluebird-global上還有其他類型的包。 在其中一篇博客文章中,用戶建議使用它而不是@types/bluebird,但某些第三方軟件包(例如,sequelize typings)引用藍鳥而不是藍鳥 - 全球,所以我得到了藍鳥缺失類型的另一個錯誤。

什麼是一個很好的解決方案,讓這個工作?

+0

你可以嘗試在文件bluebird-patch.d.ts中加入'interface Bluebird {[Symbol.toStringTag]:string}'嗎? – Paleo

+0

謝謝,但這不適合我。 – dknaack

+0

最後,這些軟件包將返回Bluebird承諾,因此您應該將Bluebird軟件包和定義文件包含到您的項目中。試圖「重命名」藍鳥承諾「承諾」,就像他們是原生的承諾可能是非常混亂(即使他們有相同的API) 另外我不明白這樣做。 :) – deKajoo

回答

0

由於Bluebird中沒有[Symbol.toStringTag],所以它確實不兼容。有跡象表明,從本地無極不同藍鳥實施其他的東西 - 調度,錯誤處理......到正確的操作方法是:

const promise: Promise<type> = Promise.resolve<type>(bluebirdPromise); 

如果運行系統的兼容性是不是肯定的一個問題,這可以用型解決鑄造只有在相對的類型安全方式:

const promise: Promise<type> = <Promise<type>><any><Bluebird<type>>bluebirdPromise; 

const promise: Promise<type> = <Promise<type>><PromiseLike<type>>bluebirdPromise; 
0

我正在處理

TS2322:類型'藍鳥'不可分配鍵入'承諾'。屬性'[Symbol.toStringTag]'在'Bluebird'類型中缺失。

,發現這個線程: https://github.com/DefinitelyTyped/DefinitelyTyped/issues/10801

的TL; DR;它的版本是做下列之一:

  1. 在每個的。TS項文件添加下面的覆蓋全球的承諾:

    import * as Bluebird from 'bluebird';

    declare global { export interface Promise<T> extends Bluebird<T> {} }

或者

  • 包裹都承諾在青鳥承諾構造函數。這裏有一些運行時間的開銷,它在Bluebird的網站上被列爲反模式。
  • 順便說一下,我無法獲得第二個選項的工作,但第一個工作適合我。