جافاسكريبت - الخاصية '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 واو واو!
