Definitelytyped: تعريف بلوبيرد 3.0 غير قابل للتنازل عن وعود ES6

تم إنشاؤها على ٥ سبتمبر ٢٠١٦  ·  48تعليقات  ·  مصدر: DefinitelyTyped/DefinitelyTyped

تعريف بلوبيرد 3.0 غير قابل للإسناد إلى تعريف الوعد القياسي es6:

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

/ سم مكعب lhecker

التعليق الأكثر فائدة

silentorb لقد @types/bluebird-global ثم تجاوز تعريف الوعد العالمي (الذي ستحصل عليه إذا كنت تستهدف منصة ES2015) عن طريق إضافة ما يلي إلى الجزء العلوي من الكود الخاص بي نقطة دخول التنفيذ:

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

ما سبق يعمل مع بيئة العقدة (أنا أستخدم الإصدار 6.10.x). إذا كنت تستخدم حزمة الويب ، فقد تحتاج إلى استخدام شيء مثل _expose-loader_.

ال 48 كومينتر

Strate هل يمكنك نشر الناتج المتبقي من tsc؟ ويرجى محاولة فتح bluebird.d.ts المحلي الخاص بك وإضافة هذا السطر الفردي من # 10831 . هل هذا يحل مشكلتك؟

خطأ كامل:

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 . إضافة هذا الخط لا يساعد.

آه فهمت ... أعتقد أنه بسبب فقدان هذا السطر هنا . هذا يعني أنه مع الكتابة الحالية ، يجب عليك إرجاع نفس النوع U من كل من onFulfill وكذلك onReject . سيكون رائعًا إذا تمكن شخص ما من إصلاح هذا في 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

يبدو أنه يمكن إصلاحه عن طريق إضافة إعلان then ، متوافق مع تصريح es6 إلى bluebird.d.ts

آه لعنة ... آسف. أعتقد أنني يجب أن آخذ استراحة أخيرًا. 😅

لذا تجاهل تعليقاتي حول ما يجب فعله في الوقت الحالي: نظرًا لأنها مفقودة على أي حال ولأنني لا أفعل ذلك حقًا أو على الأقل "لا ينبغي" أن يكون لدي الوقت لفعل أي شيء إلى جانب الدعم الأساسي مثل هذا ، فسيكون موضع تقدير كبير إذا يمكنك إرسال العلاقات العامة لإضافة تلك الأنواع إلى كلا المشروعين. 😊

@ المدقق انتهى :)

مجرد ملاحظة جانبية ، لكني أوصي دائمًا باستخدام PromiseLike عندما تقبل الوعود. سيضمن الحد الأدنى من واجهة الوعد التي تم تنفيذها حتى تتمكن من قبول معظم الوعود. بعد ذلك ، يمكنك إرجاع نوع الوعد الخاص باختيارك ، مما يجعله أكثر صرامة مثل Bluebird<T> الذي يحتوي على العديد من الطرق الإضافية. لفترة طويلة ، لم يكن أي من وعودي قابلاً للتخصيص بسبب إضافة رموز ES6 إلى أنواع الوعود ES6.

blakeembrey باستخدام PromiseLike في هذه الحالة ليس هو الحل ، لأن PromiseLike يحتوي أيضًا

للأسف ، تغيرت كتابة الوعد في الإصدار 2 من TS وبالتالي لم تعد هذه الأنواع تتوافق: https://github.com/Microsoft/TypeScript/blob/070aa83cc06b2974639bbefcde98e6e2fb5fe693/src/lib/es2015.promise.d.ts

هل يمكننا إعادة فتح هذه المشكلة؟

أي تحديثات على هذا؟

OliverJAsh @ arg20 ، هل يمكنكم تقديم حالة اختبار قابلة للتكرار ذاتيًا

Strate هنا لديك خطأي. باستخدام typecript 2.0.3 (lib.es6.d.ts) و @ 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>'.              

محاولة إلقاء وعد بلوبيرد بوعد ES6 يلقي بما يلي ( 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';

أيضًا ، أدى التحويل إلى وعد ES6 إلى الحيلة

return new Promise.resolve(bluebirdPromise)

jmendiara كما هو مذكور في # 10831 ، لا يوجد readonly [Symbol.toStringTag] في بلوبيرد في الواقع ، لذا فإن إضافة هذا إلى bluebird.d.ts خطأ بالتأكيد: يجب أن تمثل الكتابة العالم الحقيقي.
إذا كان معيار Promise يتطلب readonly [Symbol.toStringTag] ، فيجب إضافته إلى Bluebird نفسه و bluebird.d.ts أيضًا. يبدو أنه يجب عليك تحديدًا استخدام التحويل بين الطائر الأزرق والوعود المحلية (وهو أمر مزعج حقًا).
لمعلوماتك: يمكنك استخدام Promise.resolve بدون الكلمة الرئيسية new .

واجهت مشكلة عندما لا يكون وعد بلوبيرد قابلاً للتنازل عن الوعد القياسي. وفي حالتي ، من المستحيل تحويل بلوبيرد إلى المعيار Promise.resolve ، لأنه عميق في كائن الطرف الثالث. لذلك ، في بعض الأحيان يكون من المعقول الحصول على وعد بلوبيرد بأن يكون قابلاً للتنازل عن المستوى القياسي دون التحويل.
تم إنشاء طلب ميزة في مستودع تخزين بلوبيرد ، لإضافة Symbol.toStringTag إلى مثيلات بلوبيرد.

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

أي تحديثات على هذا؟

سعيد لأنني وجدت هذا الموضوع. اعتقدت أنني كنت مجنون. أود حقا أن أرى إصلاحا لهذا. لقد وصفت تفاصيل مشكلتي في SO

أواجه هذه المشكلة مع @ types / bluebird 3.5.3 و TypeScript 2.2.2.

silentorb لقد @types/bluebird-global ثم تجاوز تعريف الوعد العالمي (الذي ستحصل عليه إذا كنت تستهدف منصة ES2015) عن طريق إضافة ما يلي إلى الجزء العلوي من الكود الخاص بي نقطة دخول التنفيذ:

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

ما سبق يعمل مع بيئة العقدة (أنا أستخدم الإصدار 6.10.x). إذا كنت تستخدم حزمة الويب ، فقد تحتاج إلى استخدام شيء مثل _expose-loader_.

ksnyde : لقد جربت سابقًا @types/bluebird-global وواجهت العديد من تفاصيل الوعد المفقودة. فكرت في تصحيح @types/bluebird-global ولكن سيكون من الأفضل أن يكون لديك @types/bluebird يعمل.

silentorb المفتاح هو تجاوز مرجع الوعد العالمي ؛ يعمل بدون مشكلة بالنسبة لي. بعد قولي هذا ، سيكون من الرائع بالتأكيد أن يتم تشغيله خارج الصندوق ولكن لا داعي للانتظار مع هذا الحل.

أي تقدم في هذا؟

أنا أيضًا أتلقى هذه المشكلة. يتلخص في أخطاء مثل ما يلي:

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" :

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 ، عليك القيام بالمزيد من العمل الإضافي. الطريقة السهلة لإصلاحها هي عمل متغير مؤقت من النوع أي. ثم قم بتحويله إلى الوعد الذي تستهدفه. مثل:

""
const p: any = getPromise () ؛
إرجاع> ع ؛
""

flyingsky (وآخرون)

من ناحية أخرى ، يجب أن يكون تعيين وعود Bluebird للوطنيين الأصليين ممكنًا وصحيحًا. لكن الكثيرين هنا لديهم انطباع بأن هذا يجب أن يعمل فقط في الوقت الحالي ، وهذا ليس هو الحال بالتأكيد.

والسبب في ذلك هو أنه بينما يعرض Bluebird جميع الوظائف الشائعة بطريقة متوافقة مع المحتوى الأصلي ، فإنه _ لا _ يعرض حقلًا معينًا: يجب أن يكون الحقل [Symbol.toStringTag] "promise" . انظر هنا: https://github.com/petkaantonov/bluebird/issues/1277. هذا يجعل بلوبيرد ينظر إليه بشكل صارم غير متوافق مع الوعود المحلية. سو ...

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

هذا من الناحية الفنية اكتب غير آمن وغير صحيح.

فكرت في الترقيع @types/bluebird-global ، لكن سيكون من الأفضل أن يكون لديك @types/bluebird يعمل.

bluebird-global حالة استخدام مختلفة تمامًا عن حالة استخدام bluebird : إنه موجود في حالة اتباعك للطريق غير الآمن من النوع الكبير المتمثل في استبدال المتغير العالمي Promise بـ Bluebird . (إنه غير آمن لأن مجرد الكتابة فوقه لا يعني أن كل حزمة تعتمد عليها لن تستمر في استخدام الوعود الأصلية.)

إذا أراد أي شخص في هذه المشكلة أن يرى تقدمًا ، فأقترح فتح العلاقات العامة لمشكلة Bluebird التي سبق ذكرها: https://github.com/petkaantonov/bluebird/issues/1277

إذا أراد أي شخص في هذه المشكلة أن يرى تقدمًا ، فأنا أقترح فتح العلاقات العامة لمشكلة Bluebird التي سبق ذكرها: petkaantonov / bluebird # 1277

يبدو أنه تم إنشاء هذا العلاقات العامة: https://github.com/petkaantonov/bluebird/pull/1421

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 شكرا لتعليقك البناء!

لقد دفعني لإلقاء نظرة على الوضع في بلوبيرد.
تبين أنه تم دمج https://github.com/petkaantonov/bluebird/pull/1421 منذ 11 يومًا ، مما يعني أنهم أضافوا أخيرًا دعمًا مقابل Symbol.toStringTag ! 🎉

وهذا بدوره يعني أنه يمكن إصلاح هذه المشكلة على الفور عن طريق إعادة تقديم # 10831. سيتعين على المرء فقط استبدال "Promise" بـ "Object" . سأراجعها بصدق على الفور. 🙂

lhecker ، أنشئ # 35353 لتوضيح كل هذا!

مرحبًا ، أود فقط أن أخبركم جميعًا بأنه تم إصلاح هذه المشكلة في الإصدار 3.5.27 من @types/bluebird .
قد تستمتع الآن بقدرتك على تخصيص كل هذه Bluebirds لكل هذه الوعود. 🎉
سيتعين عليك استخدام TypeScript 3.2 أو أحدث لهذا الغرض. (انظر # 34805)

ملاحظة: شكرًا مرة أخرى JoshuaKGoldberg للتعامل مع Bluebird PR. 🙂👍

يكون:

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

لا يزال ساريًا على es2017؟

باستثناء جميع الحزم الأخرى التي تحتوي على الإصدار السابق كاعتمادية ولم تحصل على المذكرة ... وعد بالطلب ، knex ، ... لقد كسرت الكثير من التعليمات البرمجية مع هذا التحديث. يقوم المترجم الإنشائي برمي أخطاء هراء في كل مكان ، لا يبدو أنه مهم.

إذا كان ذلك يساعد أي شخص ، كما ذكرنا في الأعلى ، فقد كان لدي أسهل وقت فقط لعدم تبديل كائن الوعد العالمي الخاص بي بـ BB. لم أواجه أية مشكلات حيث كان هناك شيء واحد متوافق مع شيء آخر.

jacklinton أنا متأكد من أنك تدرك بالفعل أن اختبارات الوحدة في مكانها للتحقق من أن جميع الحزم المتأثرة لا تزال تُبنى باستخدام إصدار TypeScript المحدد دون "إلقاء أخطاء غير منطقية".
على سبيل المثال ، هذا مشروع يعرض طلب وعد بالعمل مع أحدث كتابة بلوبيرد: https://github.com/lhecker/request-promise-sample
نظرًا لأنه لا يمكنني إعادة إنتاج مشكلتك ، فسيكون من الرائع تقديم مثال بسيط يوضح المشكلات التي تراها.

من الصعب معرفة من أين تبدأ ، ولكن مع تحديث جميع الحزم الأخرى
Error:(19, 3) TS2741: Property '[Symbol.toStringTag]' is missing in type 'Bluebird<string[]>' but required in type 'Bluebird<string[]>'.
إذا قمت بإزالة @ أنواع / بلوبيرد ستختفي هذه الأخطاء. التخمين الوحيد الذي يمكنني فعله مع الوقت المتاح لدي هو أنه لم يتم استيعاب جميع الحزم الأخرى التي تحتاج إلى هذه الأنواع حتى الآن. أظن أن Knex هو الجاني المحتمل ، لكنني لا أعرف. إنه يستحوذ على التبعية الخاصة به للإصدار السابق من هذه الحزمة.

يبدو هذا الخطأ كما لو أنه تم تثبيت نسختين من @types/bluebird . يجب أن تحاول معرفة ما إذا كان بإمكانك تسطيح تلك الشجرة بحيث يكون لديك واحدة منها فقط.

يعتمد knex 0.17.3 على أحدث إصدار 3.5.27 من كتابة @types/bluebird بالمناسبة. إذا كان لديك إصدار محدث من knex ، فمن المفترض أن يعمل بالفعل.
الشيء نفسه ينطبق على نسختك الثانية من @types/bluebird بالرغم من ذلك: يجب أن تكون أيضًا 3.5.27.

شكرا لاستجابتكlhecker . لم أقصد أن أبدو ناقدة ، أعتذر. من الواضح أنك كنت تعمل بجد على هذا الأمر وهو شيء كنا ننتظره جميعًا لفترة طويلة. نشكرك على عملك الشاق لإخراج هذا التحديث بسرعة كبيرة بعد إجراء Bluebird للتغيير. سأجعل هذه الكتلة المتضخمة تعمل بالطريقة التي من المفترض أن تعمل بها بطريقة أو بأخرى.

lhecker ، هل يمكنك إعادة نشر نموذج طلب الوعد الخاص بك لأنه يبدو أنه قد انتهى. 😢

SaudiBerra الحيلة مع

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

يعطيني متابعة الخطأ في Node.js 12:

global.Promise = وعد ؛
يفتقد النوع "typeof Bluebird" الخصائص التالية من النوع "Function": تطبيق ، استدعاء ، ربط ، طول ، و 4 أخرى.

أنا أستخدم TypeScript v3.7.4 و blubird v3.7.2 و @ types / bluebird-global v3.5.12.

bennyn ليس لدي الرمز بعد الآن. انا اسف جدا. لقد حذفته بعد إصلاح مشكلة طلب الوعد.
تأكد من استخدام أحدث إصدار من @types/bluebird عند 3.5.29.

أواجه نفس الخطأ مثل bennyn ، مع أحدث إصدارات جميع Bluebird و @ types / bluebird-global و TypeScript

يبدو أن الخيار الوحيد القابل للتطبيق مع الإصدار الحالي من Bluebird 3.7.2 و TypeScript 3.6 هو عدم استخدام كتابة Bluebird على الإطلاق.

عند نقطة دخول التطبيق ، استبدل مُنشئ Promise الأصلي بـ Bluebird واستخدم 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
  • استخدام الوعد بالطلب دون أخطاء في الترجمة
  • إسناد Bluebird الحالات فئة إلى Promise اجهة (وهو ما هي هذه المسألة على وشك)

_مع ذلك ، تم إغلاق هذه القضية ولا ينبغي استخدامها لاستمرار المناقشات خارج الموضوع.
المناقشة أعلاه خارج الموضوع ، حيث أن هذه البطاقة تدور حول وعود Bluebird بعدم التنازل عن ES6 / وعود محلية. ولكن كما هو موضح أعلاه ، فقد تم إصلاح هذه المشكلة منذ فترة طويلة.
إذا كنت تواجه مشكلة في استخدام @types/[email protected] مع Bluebird ، فيرجى الاطلاع على https://github.com/DefinitelyTyped/DefinitelyTyped/issues/42084 بدلاً من ذلك.

مدقق
شكرا لكم على الرد. لقد جربت مشروعك وهو أيضًا لا يعمل:
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. تجاوز مُنشئ الوعد العالمي: window.Promise = Bluebird as any;
  3. اكتب: async function testFn(): Promise<void>
  4. أصبح النوع العالمي Promise<T> الآن مطابقًا تقريبًا لـ Bluebird<T> ويجب أن تكون قادرًا على استخدام جميع ميزات Bluebird المهمة.

إذا واجهت أي خطأ Symbol.species وما إلى ذلك ، من فضلك _ لا تستخدم هذه التذكرة بل بالأحرى # 42084.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات