Definitelytyped: bluebird 3.0-Definition kann ES6 Promises nicht zugewiesen werden

Erstellt am 5. Sept. 2016  ·  48Kommentare  ·  Quelle: DefinitelyTyped/DefinitelyTyped

Die bluebird 3.0-Definition kann nicht der standardmäßigen es6 Promise-Definition zugeordnet werden:

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

/cc @lhecker

Hilfreichster Kommentar

@silentorb Ich habe das zum Typdefinition @types/bluebird-global verwende und dann die globale Promise-Definition überschreibe (die Sie haben, wenn Sie eine ES2015-Plattform anvisieren), indem Sie Folgendes oben in meinem Code hinzufügen Einstiegspunkt für die Ausführung:

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

Das obige funktioniert für die Knotenumgebung (ich verwende 6.10.x). Wenn Sie Webpack verwenden, müssen Sie möglicherweise etwas wie _expose-loader_ verwenden.

Alle 48 Kommentare

@Strate Können Sie die verbleibende Ausgabe von tsc posten? Und versuchen Sie bitte, Ihr lokales bluebird.d.ts zu öffnen und diese einzelne Zeile von #10831 hinzuzufügen . Behebt das dein Problem?

Ganzer Fehler:

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>'.

Ich verwende [email protected] mit lib.es2016.d.ts Datei. Das Hinzufügen dieser Zeile hilft nicht.

Ah, ich verstehe... Ich glaube, es liegt an dieser Zeile, die hier fehlt. Dies bedeutet, dass Sie bei den aktuellen Eingaben den gleichen Typ U sowohl von onFulfill als auch von onReject . Es wäre super cool, wenn das jemand im npm und diesem dt-Repository übrigens beheben könnte.

In der Zwischenzeit solltest du deine .then(success, failure) wahrscheinlich in .then(success).catch(failure) aufteilen, da du das wahrscheinlich richtig gemacht hast? Obwohl es Teil der offiziellen Syntax ist, ist es bei Bluebird sowieso nicht das "bevorzugte".

Die Alternative besteht darin, dass Sie den generischen Parameter U manuell wie folgt angeben können

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

um sicherzustellen, dass Sie von beiden Callbacks denselben Typ zurückgeben.

@lhecker, aber ich verwende nicht einmal then oder catch . Ich habe sowas:

// 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

Scheint, dass es behoben werden könnte, indem man eine weitere then Deklaration hinzufügt, die mit der von es6 kompatibel ist, zu bluebird.d.ts

Ah verdammt... Entschuldigung. Ich glaube, ich sollte endlich eine Pause machen. 😅

Also ignoriere meine Kommentare, was in der Zwischenzeit zu tun ist: Da sie sowieso fehlen und ich wirklich keine Zeit habe oder zumindest "nicht" die Zeit habe, außer der grundlegenden Unterstützung wie dieser zu tun, wäre es sehr dankbar, wenn Sie könnten PRs senden, um diese Eingaben zu beiden Projekten hinzuzufügen. 😊

@lhecker fertig :)

Nur eine Randnotiz, aber ich empfehle immer, PromiseLike zu verwenden, wenn Sie Versprechen annehmen. Es garantiert die minimal implementierte Promise-Schnittstelle, sodass Sie die meisten Promises akzeptieren können. Dann können Sie den Promise-Typ Ihrer Wahl zurückgeben, was ihn strenger macht wie Bluebird<T> der viele zusätzliche Methoden hat. Lange Zeit war keines meiner Versprechen zuordenbar, weil die ES6-Symbole zu den ES6-Versprechenstypen hinzugefügt wurden.

@blakeembrey mit PromiseLike in diesem Fall nicht die Antwort, da PromiseLike auch eine inkompatible Version davon hat

Leider haben sich die Promise-Typisierungen in der TS-Version 2 geändert und daher entsprechen diese Typisierungen nicht mehr: https://github.com/Microsoft/TypeScript/blob/070aa83cc06b2974639bbefcde98e6e2fb5fe693/src/lib/es2015.promise.d.ts

Können wir dieses Thema erneut öffnen?

Irgendwelche Updates dazu?

@OliverJAsh @arg20 könnten Sie einen selbstreproduzierbaren Testfall Ihres Problems bereitstellen?

@Strate hier hast du meinen Fehler. Mit Typescript 2.0.3 (lib.es6.d.ts) und @types/bluebird v3.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>'.              

Der Versuch, das Bluebird-Versprechen in ein ES6-Versprechen umzusetzen, führt zu folgendem Ergebnis ( 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>'.         

Das Hinzufügen wie in #10831 vorgeschlagen hat für mich funktioniert

readonly [Symbol.toStringTag]: 'Promise';

auch die Konvertierung in ein ES6-Versprechen hat den Zweck erfüllt

return new Promise.resolve(bluebirdPromise)

@jmendiara wie in #10831 angegeben, gibt es in bluebird eigentlich kein readonly [Symbol.toStringTag] , also ist es definitiv falsch, dies zu bluebird.d.ts hinzuzufügen: Eingaben sollten die reale Welt darstellen.
Wenn der Promise-Standard readonly [Symbol.toStringTag] erfordert, sollte es bluebird selbst und bluebird.d.ts hinzugefügt werden. Scheint, dass Sie auf jeden Fall die Konvertierung zwischen Bluebird und nativen Versprechen verwenden sollten (was wirklich ärgerlich ist).
Zu Ihrer Information: Sie können Promise.resolve ohne das Schlüsselwort new .

Gerade ist ein Problem aufgetreten, als das Versprechen von bluebird nicht dem Standard zuordenbar ist. Und in meinem Fall ist es unmöglich, bluebird mit Promise.resolve in den Standard zu wandeln, da es sich tief im Objekt von Drittanbietern befindet. Daher ist es manchmal sinnvoll, bluebirds Versprechen ohne Konvertierung dem Standard zuzuordnen zu haben.
Habe gerade eine Funktionsanfrage im Repository von bluebird erstellt, um Symbol.toStringTag zu den Instanzen von bluebird hinzuzufügen.

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

Irgendwelche Updates dazu?

Gut, dass ich diesen Thread gefunden habe. Dachte, ich würde durchdrehen. Würde wirklich gerne eine Lösung dafür sehen. Ich habe meine Problemdetails auf SO beschrieben

Ich stoße auf dieses Problem mit @types/bluebird 3.5.3 und TypeScript 2.2.2.

@silentorb Ich habe das zum Typdefinition @types/bluebird-global verwende und dann die globale Promise-Definition überschreibe (die Sie haben, wenn Sie eine ES2015-Plattform anvisieren), indem Sie Folgendes oben in meinem Code hinzufügen Einstiegspunkt für die Ausführung:

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

Das obige funktioniert für die Knotenumgebung (ich verwende 6.10.x). Wenn Sie Webpack verwenden, müssen Sie möglicherweise etwas wie _expose-loader_ verwenden.

@ksnyde : Ich habe zuvor @types/bluebird-global ausprobiert und bin auf mehrere fehlende Versprechensdetails gestoßen. Ich habe überlegt, @types/bluebird-global patchen, aber es wäre besser, wenn @types/bluebird funktioniert.

@silentorb Der Schlüssel besteht darin, die globale Promise-Referenz zu überschreiben; funktioniert bei mir ohne probleme. Das heißt, es wäre sicherlich schön, wenn es sofort einsatzbereit wäre, aber mit dieser Lösung müssen Sie nicht warten.

Gibt es diesbezüglich Fortschritte?

Ich bekomme dieses Problem auch. Es läuft auf Fehler wie die folgenden hinaus:

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

Sehr frustrierend. Dies unterbricht auch die Verwendungen anderer Typisierungspakete, wie z. B. sequelize .

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

MissionModel wird den folgenden Fehler haben, es sei denn, Promise wird als * from "bluebird" importiert:

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 könnten Sie das Problem bitte erneut öffnen?
Beim zweiten Überlegen werde ich einfach eine neue, gezieltere einreichen.

Ich hasse es wirklich, Zeit zu verschwenden, um diese Art von Typoskriptproblemen zu beheben. Weil der Code sehr klar ist, aber um tsc zu übergeben, müssen Sie mehr zusätzliche Arbeit leisten. Die einfache Möglichkeit, das Problem zu beheben, besteht darin, eine temporäre Variable mit dem Typ any zu erstellen. Wandeln Sie es dann in Ihr Zielversprechen um. Wie zum Beispiel:

'''
const p: any = getPromise();
Rückkehr>p;
'''

@flyingsky (et. al.) Zuallererst möchte ich noch einmal daran erinnern, dass es niemals möglich sein wird, nativen Promises direkt Bluebird zuzuordnen, da Bluebird Promises Erweiterungen bereitstellen, die in der nativen Implementierung nicht existieren.

Die Zuweisung von Bluebird-Versprechen an native Versprechen sollte hingegen möglich sein und das zu Recht. Aber viele hier haben den Eindruck, dass dies jetzt einfach funktionieren sollte, was definitiv nicht der Fall ist.

Der Grund dafür ist, dass Bluebird zwar alle allgemein bekannten Funktionen auf native kompatible Weise verfügbar macht, aber ein bestimmtes Feld _nicht_: Das Feld [Symbol.toStringTag] muss "promise" . Siehe hier: https://github.com/petkaantonov/bluebird/issues/1277. Dies macht Bluebird streng genommen inkompatibel mit nativen Versprechen. Soo...

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

Dies ist typtechnisch unsicher und falsch.

Ich habe überlegt, @types/bluebird-global patchen, aber es wäre besser, wenn @types/bluebird funktioniert.

bluebird-global dient einem ganz anderen Anwendungsfall als bluebird : Es existiert für den Fall, dass Sie den sehr unsicheren Weg gehen, die globale Variable Promise mit Bluebird überschreiben.

Wenn jemand in dieser Ausgabe Fortschritte sehen möchte, schlage ich freundlich vor, eine PR für das bereits erwähnte Bluebird-Problem zu eröffnen: https://github.com/petkaantonov/bluebird/issues/1277

Wenn jemand in dieser Ausgabe Fortschritte sehen möchte, schlage ich freundlich vor, eine PR für die bereits erwähnte Bluebird-Ausgabe zu eröffnen: petkaantonov/bluebird#1277

Anscheinend wurde diese PR erstellt: https://github.com/petkaantonov/bluebird/pull/1421

@ksnyde – Dein @types/bluebird-global Vorschlag funktioniert für mich, leicht modifiziert:

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

Ansonsten bekomme ich error TS6133: 'Promise' is declared but its value is never read. Was für tsconfig.json mit "noUnusedLocals": true erwartet wird.

Dankeschön.

Ich verwende bluebird-global , erhalte aber immer noch diesen Fehler:

Die Eigenschaft '[Symbol.toStringTag]' fehlt im Typ 'Bluebird'

Das Hinzufügen dieser Zeile behebt das Problem https://github.com/DefinitelyTyped/DefinitelyTyped/pull/10831/files

Gibt es eine Möglichkeit, es lokal zu beheben, ohne die Eingaben von bluebird zu ändern?

+1

@gdpaulmil Danke für deinen konstruktiven Kommentar!

Das veranlasste mich, einen Blick auf den Stand der Dinge bei Bluebird zu werfen.
Es stellte sich heraus, dass https://github.com/petkaantonov/bluebird/pull/1421 vor 11 Tagen zusammengeführt wurde, was bedeutet, dass sie endlich Unterstützung für Symbol.toStringTag hinzugefügt haben! 🎉

Dies wiederum bedeutet, dass dieses Problem sofort behoben werden kann, indem Sie #10831 erneut einreichen. Man muss nur "Promise" mit "Object" . Ich würde es ehrlich gesagt sofort überprüfen. 🙂

@lhecker , erstellt #35353, um das alles aufzuklären!

Hey, ich möchte Sie alle wissen lassen, dass dieses Problem in v3.5.27 von @types/bluebird behoben wurde.
Sie können jetzt genießen, all diese Bluebirds all diesen Versprechen zuordnen zu können. 🎉
Sie müssen dafür jedoch TypeScript 3.2 oder neuer verwenden. (Siehe #34805)

PS: Nochmals vielen Dank

Ist:

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

Gilt noch für es2017?

Abgesehen von all den anderen Paketen, die die vorherige Version als Abhängigkeit haben und nicht das Memo bekommen haben... request-promise, knex,... hast du mit diesem Update einfach viel Code kaputt gemacht. Der Typescript-Compiler wirft überall unsinnige Fehler aus, Typescript 3.3, 3.4, 3.5... scheint keine Rolle zu spielen.

Wenn es jemandem hilft, wie oben erwähnt, hatte ich die einfachste Zeit, mein globales Promise-Objekt NICHT gegen BB auszutauschen. Ich habe keine Probleme festgestellt, bei denen eine Sache mit einer anderen kompatibel war.

@jacklinton Ich bin mir sicher, dass Sie bereits wissen, dass
Hier ist zum Beispiel ein Projekt, das zeigt, wie Request-Promise mit den neuesten Bluebird-Typisierungen arbeitet: https://github.com/lhecker/request-promise-sample
Da ich Ihr Problem nicht reproduzieren kann, wäre es großartig, wenn Sie ein minimales Beispiel bereitstellen könnten, das die Probleme zeigt, die Sie sehen.

Es ist schwer zu wissen, wo man anfangen soll, aber mit allen anderen Paketen auf dem neuesten Stand
Error:(19, 3) TS2741: Property '[Symbol.toStringTag]' is missing in type 'Bluebird<string[]>' but required in type 'Bluebird<string[]>'.
Wenn ich @types/bluebird entferne, verschwinden diese Fehler. Die einzige Vermutung, die ich mit der mir zur Verfügung stehenden Zeit aufstellen kann, ist, dass noch nicht alle anderen Pakete, die diese Typen benötigen, aufgeholt haben. Ich vermute, dass Knex ein wahrscheinlicher Täter ist, aber ich weiß es nicht. Es greift seine eigene Abhängigkeit von der vorherigen Version dieses Pakets.

Dieser Fehler hört sich an, als ob Sie zwei Versionen von @types/bluebird installiert hätten. Sie sollten versuchen, zu sehen, ob Sie diesen Baum platt drücken können, damit Sie nur einen davon haben.

knex 0.17.3 hängt übrigens von der neuesten 3.5.27-Version der @types/bluebird -Typisierungen ab. Wenn Sie eine aktuelle Version von Knex haben, sollte es tatsächlich funktionieren, nehme ich an.
Dasselbe gilt jedoch für Ihre zweite Kopie von @types/bluebird : Es sollte auch 3.5.27 sein.

Vielen Dank für Ihre Reaktionsfähigkeit

@lhecker können Sie bitte Ihr Request-Promise-Sample erneut veröffentlichen, da es scheinbar weg ist. 😢

@VictorioBerra der Trick mit

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

gibt mir bei Node.js 12 folgenden Fehler:

global.Versprechen = Versprechen;
Beim Typ 'typeof Bluebird' fehlen die folgenden Eigenschaften vom Typ 'Function': apply, call, bind, length und 4 weitere.

Ich verwende TypeScript v3.7.4, bluebird v3.7.2 und @types/bluebird-global v3.5.12.

@bennyn Ich habe den Code nicht mehr. Es tut mir sehr leid. Ich habe es gelöscht, nachdem das Anfrage-Versprechen-Problem behoben wurde.
Stellen Sie sicher, dass Sie die neueste Version von @types/bluebird unter 3.5.29 verwenden.

Ich habe den gleichen Fehler wie @bennyn , mit den neuesten Versionen von allen bluebird, @types/bluebird-global und TypeScript

Es scheint die einzige praktikable Option mit der aktuellen Version von Bluebird 3.7.2 und TypeScript 3.6 zu sein, überhaupt keine Bluebird-Typisierungen zu verwenden.

Am App-Einstiegspunkt ersetze ich den nativen Promise-Konstruktor durch Bluebird und verwende Bluebird danach mit der nativen Promise-API:

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

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

Ich persönlich glaube ehrlich gesagt, dass Sie etwas falsch machen. 😖
Ich habe mein minimales request-promise-sample Projekt rekonstruiert, das zeigt, wie Sie absolut 100% definitiv können ...

  • Weisen Sie den Bluebird Konstruktor global.Promise
  • Anfrage-Versprechen ohne Kompilierungsfehler verwenden
  • Weisen Sie Bluebird Klasseninstanzen der Promise Schnittstelle zu (um die es in diesem Problem geht)

_Dieses Thema wurde jedoch geschlossen und sollte nicht für weitere Diskussionen außerhalb des Themas verwendet werden._
Die obige Diskussion gehört nicht zum Thema, da es in diesem Ticket darum geht, dass Bluebird-Versprechen nicht ES6/nativen Versprechen zugeordnet werden können. Aber wie oben gezeigt, ist dieses Problem seit langem behoben.
Wenn Sie Probleme bei der Verwendung von @types/[email protected] mit Bluebird haben, besuchen Sie stattdessen https://github.com/DefinitelyTyped/DefinitelyTyped/issues/42084 .

@lhecker
Danke für Ihre Antwort. Ich habe dein Projekt ausprobiert und es funktioniert auch nicht:
Annotation 2020-03-21 084422

Die Installation von @types/[email protected] hilft auch nicht:
Annotation 2020-03-21 084750

Geändertes Projekt finden Sie hier:
https://github.com/chebum/request-promise-sample

@chebum Ihr obiger Kommentar hat nicht deutlich gemacht, dass Sie versuchen, asynchrone Funktionen als solche Bluebird<T> . Dann hätte ich dir schon sagen können, dass dies leider nicht möglich ist. Wie Sie an der Ausgabe Ihres Compilers sehen können, _muss_ Sie einen Promise<T> Typ von einer asynchronen Funktion zurückgeben.

Wenn Sie auf Ihre Typsicherheit verzichten möchten, können Sie jedoch Folgendes tun:

  1. @types/bluebird-global als Abhängigkeit hinzufügen
  2. Überschreiben Sie den globalen Promise-Konstruktor: window.Promise = Bluebird as any;
  3. Schreiben Sie: async function testFn(): Promise<void>
  4. Der globale Typ Promise<T> ist jetzt fast identisch mit Bluebird<T> und Sie sollten alle wichtigen Bluebird-Funktionen nutzen können.

Wenn Sie auf Symbol.species Fehler usw. stoßen, verwenden Sie bitte _nicht_ dieses Ticket, sondern #42084.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen