جافاسكريبت - الخاصية 'allSettled' غير موجودة على نوع 'PromiseConstructor'.ts(2339)


أحاول استخدام واجهة برمجة التطبيقات Promise.allSettled مع TypeScript. الكود هنا:

server.test.ts:

it('should partial success if QPS > 50', async () => {
  const requests: any[] = [];
  for (let i = 0; i < 51; i++) {
    requests.push(rp('http://localhost:3000/place'));
  }
  await Promise.allSettled(requests);
  // ...
});

لكن TSC يطرح خطأ:

الخاصية 'allSettled' غير موجودة في النوع 'PromiseConstructor'.ts(2339)

لقد قمت بالفعل بإضافة هذه القيم إلى خيار lib في tsconfig.json:

tsconfig.json:

{
  "compilerOptions": {
    /* Basic Options */
    "target": "ES2015" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */,
    "module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */,
    "lib": [
      "ES2015",
      "ES2016",
      "ES2017",
      "ES2018",
      "ES2019",
      "ES2020",
      "ESNext"
    ] 
   // ...
}

إصدار TypeScript: "typescript": "^3.7.3"

فكيف يمكنني حل هذا؟ أعلم أنني أستطيع استخدام وحدة بديلة، لكني فضولي بشأن العمل مع TypeScript بشكل أصلي.

الإجابة رقم 1

تم دمج الأنواع الخاصة بـ Promise.allSettled() فقط في يناير، ويبدو أنه سيتم إصدارها في TypeScript 3.8.

كحل مؤقت، يمكنك إعلان نوع يشبه المحاكاة (mock-ish) للدالة بنفسك:

declare interface PromiseConstructor {
    allSettled(promises: Array<Promise<any>>): Promise<Array<{status: 'fulfilled' | 'rejected', value?: any, reason?: any}>>;
}

الإجابة رقم 2

لتشغيل هذا على لينكس، كنت بحاجة إلى أحدث إصدار من تايبسكريبت:

npm install -g typescript@latest

ثم في ملف tsconfig الخاص بك تحتاج حاليًا إلى مكتبة ES2020.Promise. ملف tsconfig الكامل الخاص بي:

{
  "compilerOptions": {
    "sourceMap": true,
    "module": "commonjs",
    "target": "es5",
    "jsx": "react",
    "esModuleInterop": true,
    "allowJs": true,
    "outDir": "./dist",
    "lib": [
      "ES2020.Promise",
    ]
  },
  "include": [
    "./src"
  ],
  "exclude": [
    "./node_modules",
    "./build"
  ],
  "compileOnSave": true,
  "parserOptions": {
    "ecmaFeatures": {
      "jsx": true
    }
  }
}

الاستخدام: const results=await Promise.allSettled(BatchOfPromises);

الإجابة رقم 3

حل بديل لاستخدامه مع إصدار Typescript الأقدم

await (Promise as any).allSettled(promises);

الإجابة رقم 4

إنه ES2020 وفي المرحلة 4، لذا ليس متاحًا في كل مكان بدون بوليفيل. تم كتابته بالأنواع ودمجه في TS. حاول تثبيت أحدث حزمة @types/node وانظر إذا كان ذلك يجلبه.

تحديث: يبدو أنه سيضيف es2020.promise إلى المكتبات، عندما يتم ذلك.

تحديث: npm i [email  واو واو!