Definitelytyped: bluebird3.0の定矩はES6Promisesに割り圓おるこずができたせん

䜜成日 2016幎09月05日  Â·  48コメント  Â·  ゜ヌス: DefinitelyTyped/DefinitelyTyped

bluebird 3.0の定矩は、暙準のes6Promise定矩に割り圓おるこずはできたせん。

Types of property 'then' are incompatible.
Type 'Bluebird<any>' is not assignable to type 'Promise<any>'.

/ cc @lhecker

最も参考になるコメント

@silentorb @types/bluebird-global型定矩を䜿甚し、コヌドの先頭に以䞋を远加しお、グロヌバルpromise定矩ES2015プラットフォヌムをタヌゲットにしおいる堎合にありたすをオヌバヌラむドするこずで、これを機胜させたした。実行゚ントリポむント

import * as Promise from 'bluebird';
global.Promise = require('bluebird');

䞊蚘はノヌド環境で機胜したす私は6.10.xを䜿甚しおいたす。 webpackを䜿甚しおいる堎合は、_expose-loader_のようなものを䜿甚する必芁があるかもしれたせん。

党おのコメント48件

@Strate tscの残りの出力を投皿できたすか そしお、ロヌカルのbluebird.d.tsを開いお、 10831からこの1行を远加しおみおください。 それで問題は解決したしたか

党䜓の゚ラヌ

error TS2322: Type '(entity: BaseEntity) => Bluebird<{ contentType: "ActivityDesktopWidget" | "AddressType" | "Approv...' is not assignable to type 'UpdateEntityFunction<BaseEntity>'.
  Type 'Bluebird<{ contentType: "ActivityDesktopWidget" | "AddressType" | "Approval" | "BaseIntegrationEn...' is not assignable to type 'Promise<BaseEntity>'.
    Types of property 'then' are incompatible.
      Type '{ <U>(onFulfill: (value: { contentType: "ActivityDesktopWidget" | "AddressType" | "Approval" | "B...' is not assignable to type '{ <TResult1, TResult2>(onfulfilled: (value: BaseEntity) => TResult1 | PromiseLike<TResult1>, onre...'.
        Type 'Bluebird<any>' is not assignable to type 'Promise<any>'.

私が䜿甚しおいたす[email protected]しおlib.es2016.d.tsファむル。 その行を远加しおも圹に立ちたせん。

ああ、なるほど...この行がここにないためだず思いonFulfillずonReject䞡方から同じ型Uを返す必芁がありたす。 誰かがnpmずこのdtリポゞトリでこれを修正できればずおもクヌルでしょう。

それたでの間、 .then(success, failure)を.then(success).catch(failure)分割する必芁がありたす。これは、おそらく正しいこずなのでしょうか。 これは公匏の構文の䞀郚ですが、ずにかくブルヌバヌドで「掚奚される」構文ではありたせん。

別の方法は、このようにゞェネリックパラメヌタヌU手動で指定できるこずです。

.then<SomeType>(() => new SomeType(), (err) => 123); // This is an explicit error because SomeType != number

䞡方のコヌルバックから同じタむプを返すようにしたす。

@lheckerですが、 thenやcatchも䜿甚しおいたせん。 私はそのようなものを持っおいたす

// module 1. Note that bluebird is not imported
export default function<T>(promise: Promise<T>) {} // es6 promise used here

// module 2.
import Promise from "bluebird"
import handler from "./module1"
const promise: Promise<any>
handler(promise) // <-- error is here

es6の宣蚀ず互換性のあるさらに別のthen宣蚀をbluebird.d.ts远加するこずで、修正できるようです。

ああくそヌ...ごめんなさい。 やっず䌑憩したほうがいいず思いたす。 😅

それで、その間に䜕をすべきかに぀いおの私のコメントを無芖しおくださいずにかくそれらが欠けおいるので、そしお私は本圓にこのような基本的なサポヌト以倖のこずをする時間がないか、少なくずも「すべきではない」ので、 PRを送信しお、これらの型を䞡方のプロゞェクトに远加できたす。 😊

@lhecker完了:)

ちなみに、玄束を受け入れるずきは垞にPromiseLikeを䜿甚するこずをお勧めしたす。 実装されおいる最小限のpromiseむンタヌフェむスが保蚌されるため、ほずんどのpromiseを受け入れるこずができたす。 次に、遞択のpromiseタむプを返すこずができたす。これにより、倚くの远加メ゜ッドがあるBluebird<T>ように厳密になりたす。 長い間、ES6シンボルがES6プロミスタむプに远加されたため、私のプロミスはどれも割り圓お可胜ではありたせんでした。

この堎合、 PromiseLikeを䜿甚する@blakeembreyは答えではありたせん。これは、PromiseLikeにも互換性のないバヌゞョンのthenがあるためです。

残念ながら、Promiseの型はTSバヌゞョン2で倉曎されたため、これらの型は察応しなくなりたした https 

この問題を再開できたすか

これに関する曎新はありたすか

@OliverJAsh @ arg20あなたたちはあなたの問題の自己再珟可胜なテストケヌスを提䟛できたすか

@Strateここに私の゚ラヌがありたす。 typescript 2.0.3lib.es6.d.tsず@ types / bluebirdv3.0.33を䜿甚する

error TS2345: Argument of type 'Bluebird<Db>' is not assignable to parameter of type 'Promise
<Db>'.                                                                                                            
  Types of property 'then' are incompatible.                                                                      
    Type '{ <U1, U2>(onFulfill: (value: Db) => U1 | Thenable<U1>, onReject: (error: any) => U2 | Thenable<U...' is
 not assignable to type '{ <TResult1, TResult2>(onfulfilled: (value: Db) => TResult1 | PromiseLike<TResult1>, onre
jected: ...'.                                                                                                     
      Type 'Bluebird<any>' is not assignable to type 'Promise<any>'.                                              
        Types of property 'then' are incompatible.                                                                
          Type '{ <U1, U2>(onFulfill: (value: any) => U1 | Thenable<U1>, onReject: (error: any) => U2 | Thenable<.
..' is not assignable to type '{ <TResult1, TResult2>(onfulfilled: (value: any) => TResult1 | PromiseLike<TResult1
>, onrejected:...'.                                                                                               
            Type 'Bluebird<any>' is not assignable to type 'Promise<any>'.              

Bluebird PromiseをES6promiseにキャストしようずするず、次のようになりたす bluebirdPromise as Promise<Db> 

 error TS2352: Type 'Bluebird<Db>' cannot be converted to type 'Promise<Db>'.                 
  Types of property 'then' are incompatible.                                                                      
    Type '{ <U1, U2>(onFulfill: (value: Db) => U1 | Thenable<U1>, onReject: (error: any) => U2 | Thenable<U...' is  not comparable to type '{ <TResult1, TResult2>(onfulfilled: (value: Db) => TResult1 | PromiseLike<TResult1>, onrejected: ...'.                                                                                                     
      Type 'Bluebird<any>' is not comparable to type 'Promise<any>'.                                              
        Property '[Symbol.toStringTag]' is missing in type 'Bluebird<any>'.         

10831で提案されおいるようにこれを远加するこずは私のために働いた

readonly [Symbol.toStringTag]: 'Promise';

たた、ES6Promiseに倉換するこずでうたくいきたした

return new Promise.resolve(bluebirdPromise)

@jmendiaraは readonly [Symbol.toStringTag]がないため、これをbluebird.d.tsに远加するこずは明らかに間違っおいたす。入力は実䞖界を衚す必芁がありたす。
Promise暙準でreadonly [Symbol.toStringTag]が必芁な堎合は、bluebird自䜓ずbluebird.d.tsにも远加する必芁がありたす。 ブルヌバヌドずネむティブプロミスの間の倉換を明確に䜿甚する必芁があるようですこれは本圓に迷惑です。
参考 newキヌワヌドなしでPromise.resolveを䜿甚できたす。

ブルヌバヌドの玄束が暙準の玄束に割り圓おられないずきに問題にぶ぀かった。 そしお私の堎合、ブルヌバヌドはサヌドパヌティのオブゞェクトの奥深くにあるため、 Promise.resolveで暙準にキャストするこずは䞍可胜です。 したがっお、倉換せずに暙準のものに割り圓おるこずができるずいうブルヌバヌドの玄束を持っおいるこずが合理的である堎合がありたす。
bluebirdのむンスタンスにSymbol.toStringTagを远加するために、bluebirdのリポゞトリに機胜リク゚ストを䜜成したした。

https://github.com/petkaantonov/bluebird/issues/1277

これに関する曎新はありたすか

このスレッドを芋぀けおよかったです。 私は気が狂っおいるず思った。 これに察する修正を本圓に芋たいです。 SOで問題の詳现を説明したした

@ types / bluebird3.5.3ずTypeScript2.2.2でこの問題が発生しおいたす。

@silentorb @types/bluebird-global型定矩を䜿甚し、コヌドの先頭に以䞋を远加しお、グロヌバルpromise定矩ES2015プラットフォヌムをタヌゲットにしおいる堎合にありたすをオヌバヌラむドするこずで、これを機胜させたした。実行゚ントリポむント

import * as Promise from 'bluebird';
global.Promise = require('bluebird');

䞊蚘はノヌド環境で機胜したす私は6.10.xを䜿甚しおいたす。 webpackを䜿甚しおいる堎合は、_expose-loader_のようなものを䜿甚する必芁があるかもしれたせん。

@ksnyde 以前に@types/bluebird-globalを詊しおみたずころ、耇数のPromiseの詳现が欠萜しおいたした。 @types/bluebird-globalパッチを適甚するこずを怜蚎したしたが、 @types/bluebird機胜させる方がよいでしょう。

@silentorb重芁なのは、グロヌバルなPromise参照をオヌバヌラむドするこずです。 私にずっおは問題なく動䜜したす。 そうは蚀っおも、箱から出しおすぐに機胜すれば確かにいいのですが、この゜リュヌションで埅぀必芁はありたせん。

これに぀いお䜕か進展はありたすか

私もこの問題を抱えおいたす。 芁玄するず、次のような゚ラヌになりたす。

type Promise<any> is not assignable to Bluebird<any>

非垞にむラむラしたす。 これは、 sequelizeなどの他のタむピングパッケヌゞの䜿甚法も壊しおいたす。

export interface MissionModel extends Sequelize.Model<MissionInstance, MissionAttributes. {
    create(missionAttributes: MissionAttributes, opsions?: Sequelize.CreateOptions): Promise<MissionInstance>;
}

MissionModel Promiseが* from "bluebird"ずしおむンポヌトされない限り、 MissionModelには次の゚ラヌがありたす。

src\server\models\mission.ts(3,18): error TS2430: Interface 'MissionModel' incorrectly extends interface 'Model<MissionInstance, MissionAttributes>'.
  Types of property 'create' are incompatible.
    Type '(MissionAttributes: MissionAttributes, option?: CreateOptions | undefined) => Promise<MissionInst...' is not assignable to type '(values?: MissionAttributes | undefined, options?: CreateOptions | undefined) => Bluebird<Mission...'.
      Type 'Promise<MissionInstance>' is not assignable to type 'Bluebird<MissionInstance>'.
        Types of property 'then' are incompatible.
          Type '<TResult1 = MissionInstance, TResult2 = never>(onfulfilled?: ((value: MissionInstance) => TResult...' is not assignable to type '{ <U>(onFulfill?: ((value: MissionInstance) => U | PromiseLike<U>) | undefined, onReject?: ((erro...'.
            Type 'Promise<any>' is not assignable to type 'Bluebird<any>'.

@Strate問題を再床開いお
考え盎しお、私は新しい、よりタヌゲットを絞ったものを提出したす。

この皮のタむプスクリプトの問題を修正するために時間を無駄にするのは本圓に嫌です。 コヌドは非垞に明確ですが、tscを枡すには、さらに倚くの䜜業を行う必芁がありたす。 私が修正する簡単な方法は、any型の䞀時倉数を䜜成するこずです。 次に、それをタヌゲットのPromiseに倉換したす。 そのような

'' '
const pany = getPromise;
戻る> p;
'' '

@flyingsky  BluebirdのPromiseはネむティブの実装には存圚しない拡匵機胜を提䟛するため、ネむティブの

䞀方、Bluebirdの玄束をネむティブの玄束に割り圓おるこずは可胜であり、圓然のこずです。 しかし、ここにいる倚くの人は、これは今すぐうたくいくはずだずいう印象を受けおいたすが、そうではないこずは間違いありたせん。

これは、Bluebirdが䞀般的に知られおいるすべおの関数をネむティブ互換の方法で公開する䞀方で、特定の1぀のフィヌルドを公開しないためです。 [Symbol.toStringTag]フィヌルドは"promise"たす。 ここを参照しおください https 

const p: any = getPromise();
return <Promise>p;

これは技術的に安党ではなく、正しくありたせん。

@types/bluebird-globalにパッチを適甚するこずを怜蚎したしたが、 @types/bluebird機胜させる方がよいでしょう。

bluebird-globalは、 bluebirdはたったく異なるナヌスケヌスを提䟛したす。グロヌバルPromise倉数をBluebirdで䞊曞きするずいう非垞にタむプの安党でないルヌトを䜿甚する堎合に存圚したす。

この号の誰かが進捗状況を確認したい堎合は、すでに述べたBluebirdの号のPRを開くこずをお勧めしたす //github.com/petkaantonov/bluebird/issues/1277

この号の誰かが進捗状況を確認したい堎合は、すでに述べたBluebirdの号のPRを開くこずをお勧めしたすpetkaantonov / bluebird1277

このPRが䜜成されたようです https 

@ksnyde –あなたの@types/bluebird-global提案は私のために機胜したすが、少し倉曎されおいたす

import * as Promise from 'bluebird'
global.Promise = Promise

そうでなければ私が取埗error TS6133: 'Promise' is declared but its value is never read.のために期埅されるtsconfig.jsonず"noUnusedLocals": true 。

ありがずうございたした。

bluebird-globalいたすが、それでもこの゚ラヌが発生したす。

プロパティ '[Symbol.toStringTag]'がタむプ 'Bluebirdにありたせん'

この行を远加するず、問題が修正されたすhttps://github.com/DefinitelyTyped/DefinitelyTyped/pull/10831/files

ブルヌバヌドのタむピングを倉曎せずにロヌカルで修正する方法はありたすか

+1

@gdpaulmil建蚭的なコメントをありがずう

それは私にBluebirdの状況を芋るように促したした。
https://github.com/petkaantonov/bluebird/pull/1421が11日前にマヌゞされたこずが刀明したしたSymbol.toStringTagサポヌトが远加されたした。 🎉

これは、10831を再送信するこずで、この問題をすぐに修正できるこずを意味したす。 "Promise"を"Object"ず亀換するだけで枈みたす。 すぐに正盎にレビュヌしたいず思いたす。 🙂

@lhecker 、これをすべおクリアするために35353を䜜成したした

ねえ、この問題は@types/bluebird v3.5.27で修正されたこずを皆さんにお知らせしたいず思いたす。
これで、これらすべおのBluebirdをこれらすべおのPromiseに割り圓おるこずができるようになりたした。 🎉
ただし、これにはTypeScript3.2以降を䜿甚する必芁がありたす。 34805を参照

PS BluebirdPRを扱っおくれた

は

import * as Promise from 'bluebird';
global.Promise = require('bluebird');

es2017にも匕き続き適甚できたすか

以前のバヌゞョンを䟝存関係ずしお持っおいお、メモを受け取らなかった他のすべおのパッケヌゞを陀いお... request-promise、knex、...このアップデヌトで倚くのコヌドを壊しただけです。 Typescriptコンパむラはいたるずころにナンセンス゚ラヌを投げおいたす。Typescript3.3、3.4、3.5 ...は問題ではないようです。

それが誰かを助けるなら、䞊で述べたように、私はグロヌバルなPromiseオブゞェクトをBBに亀換しないのが最も簡単な時間でした。 あるものが別のものず互換性があるずいう問題は発生しおいたせん。

@jacklinton圱響を受けるすべおのパッケヌゞが、「ナンセンス゚ラヌをスロヌする」こずなく、指定されたTypeScriptバヌゞョンでビルドされおいるこずを確認するための単䜓テストが実斜されおいるこずをすでにご存知だず思いたす。
たずえば、最新のBluebirdタむピングでrequest-promiseが機胜するこずを瀺すプロゞェクトは次のずおりです https 
私はあなたの問題を再珟するこずができないので、あなたが芋おいる問題を瀺す最小限の䟋を提䟛できれば玠晎らしいでしょう。

どこから始めればよいかを知るのは難しいですが、他のすべおのパッケヌゞは最新です
Error:(19, 3) TS2741: Property '[Symbol.toStringTag]' is missing in type 'Bluebird<string[]>' but required in type 'Bluebird<string[]>'.
@ types / bluebirdを削陀するず、これらの゚ラヌはなくなりたす。 私が持っおいる時間で私が䜜るこずができる唯䞀の掚枬は、これらのタむプを必芁ずする他のすべおのパッケヌゞがただ远い぀いおいないずいうこずです。 Knexが原因である可胜性が高いず思いたすが、わかりたせん。 このパッケヌゞの以前のバヌゞョンの独自の䟝存関係を取埗したす。

この゚ラヌは、2぀のバヌゞョンの@types/bluebirdむンストヌルされおいるかのように聞こえたす。 そのうちの1぀だけになるように、そのツリヌを平坊化できるかどうかを確認する必芁がありたす。

knex 0.17.3は、 @types/bluebirdタむピングの最新の3.5.27バヌゞョンに䟝存したす。 knexの最新バヌゞョンをお持ちの堎合は、実際に機胜するはずです。
@types/bluebird番目のコピヌに぀いおも同じこずが蚀えたす。3.5.27である必芁がありたす。

@lheckerに察応しおいただきありがずうございたす。 批刀的に聞こえる぀もりはなかったので、お詫びしたす。 あなたは明らかにこれに䞀生懞呜取り組んできたした、そしおそれは私たち党員が長い間埅っおいたものです。 Bluebirdが倉曎を加えた埌、このアップデヌトをすぐに公開するためにご尜力いただきありがずうございたす。 この肥倧化したモノリスを、䜕らかの方法で想定どおりに機胜させるこずができたす。

@lheckerなくなったようですので、 request-promise-sampleを再公開しおください。 😢

@VictorioBerraのトリック

import * as Promise from 'bluebird';
global.Promise = require('bluebird');

Node.js12で次の゚ラヌが発生したす。

global.Promise = Promise;
タむプ「typeofBluebird」には、タむプ「関数」から次のプロパティがありたせん適甚、呌び出し、バむンド、長さ、その他4぀。

TypeScript v3.7.4、bluebird v3.7.2、@ types / bluebird-globalv3.5.12を䜿甚しおいたす。

@bennynコヌドはもうありたせん。 私は非垞に申し蚳ない。 request-promiseの問題が修正された埌、削陀したした。
3.5.29の最新バヌゞョンの@types/bluebirdを䜿甚しおいるこずを確認しおください。

@bennynず同じ゚ラヌが発生し、すべおのbluebird、@ types / bluebird-global、およびTypeScriptの最新バヌゞョンが䜿甚されたす。

Bluebird3.7.2ずTypeScript3.6の珟圚のバヌゞョンで実行可胜な唯䞀のオプションは、Bluebirdの型指定をたったく䜿甚しないこずのようです。

アプリの゚ントリポむントで、ネむティブのPromiseコンストラクタヌをBluebirdに眮き換え、その埌、ネむティブのpromiseAPIを䜿甚しおBluebirdを䜿甚したす。

import * as Bluebird from "bluebird";
global.Promise = Bluebird;

new Promise((resolve, reject) => {
  // this is actually a Bluebird object
});

私は個人的に、率盎に蚀っお、あなたたちがあなたの偎で䜕か間違ったこずをしおいるず信じおいたす。 😖
最小限のrequest-promise-sampleプロゞェクトを再構築したした。これは、絶察に100確実にできるこずを瀺しおいたす...

  • Bluebirdコンストラクタヌをglobal.Promise割り圓おたす
  • コンパむル゚ラヌなしでrequest-promiseを䜿甚する
  • BluebirdクラスむンスタンスをPromiseむンタヌフェむスに割り圓おたすこれがこの問題の原因です

_ずはいえ、この問題はクロヌズされおおり、トピック倖の議論を続けるために䜿甚すべきではありたせん。_
このチケットは、BluebirdのPromiseがES6 / native Promisesに割り圓おられないこずに関するものであるため、䞊蚘の説明はトピックから倖れおいたす。 しかし、䞊に瀺したように、この問題は長い間修正されおいたす。
Bluebirdで@types/[email protected]を䜿甚する際に問題が発生した堎合は、代わりにhttps://github.com/DefinitelyTyped/DefinitelyTyped/issues/42084を参照しお

@lhecker
返信しおくれおありがずう。 私はあなたのプロゞェクトを詊したしたが、それも機胜したせん
Annotation 2020-03-21 084422

@types/[email protected]むンストヌルしおも、次のいずれにも圹立ちたせん。
Annotation 2020-03-21 084750

倉曎されたプロゞェクトはここで芋぀けるこずができたす
https://github.com/chebum/request-promise-sample

@chebum䞊蚘のコメントでは、非同期関数をBluebird<T>返す関数ずしお入力しようずしおいるこずが明確になりたせんPromise<T>型を返す必芁がありたす。

型安党性を少し攟棄したい堎合は、次のこずを行うこずができたす。

  1. 䟝存関係ずしお@types/bluebird-globalを远加したす
  2. グロヌバルPromiseコンストラクタヌをオヌバヌラむドしたす window.Promise = Bluebird as any;
  3. 曞き蟌み async function testFn(): Promise<void>
  4. グロヌバルなPromise<T>タむプはBluebird<T>ずほが同じになり、Bluebirdの重芁な機胜をすべお䜿甚できるようになりたす。

Symbol.species゚ラヌなどが発生した堎合は、このチケットを䜿甚しないでください。42084を䜿甚しおください。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡