Awaited<T>

آخر تحديث: 2026-10-22

Awaited<T> Awaited

يحاكي Awaited<T> الأثر النوعي لـ await: فك Promise<T> للحصول على T مع فك الـ Promise المتداخلة (Promise<Promise<T>>) تكراريًا أيضًا. ولمعرفة «نوع النتيجة بعد نجاح دالة async» فالتركيبة المعيارية هي Awaited<ReturnType<typeof fn>>.

المجموعةالأنواع المساعدة
النوعنوع
الوضع الصارمغير مطلوب

ℹ️ معلومة يحوّل المحرر لغة TypeScript إلى JavaScript ثم يشغّلها (بدون فحص أنواع)؛ راجع ناتج كل مثال لنتيجة فحص الأنواع.

📝 الصيغة

// تنفيذ مبسّط (النسخة الرسمية تعالج thenables أيضًا)
type Awaited<T> = T extends Promise<infer V> ? Awaited<V> : T;

// الاستخدام
type User = Awaited<ReturnType<typeof fetchUser>>;   // يفك Promise<User>

⚙️ المعاملات

Tأي نوع: إن كان Promise (أو thenable) فُكّ تكراريًا، وإلا مُرّر كما هو

القيمة المُعادة:نوع T بعد الانتظار: نوع القيمة النهائية بعد فك سلسلة الـ Promise بالكامل.

▶ مثال

عدّل الكود أدناه واضغط «جرّب» لرؤية نتيجة التحويل:

الناتج:

1: Ada
done

(مخرجات التشغيل بعد الترجمة؛ على مستوى النوع: LoadedUser هو { id: number; name: string } لا Promise<...> — فقد فكّه Awaited، ومن ثم يمكن الوصول إلى user.id مباشرة)

💡 نقاط مهمة

ℹ️ معلومة الـ Awaited نوع شرطي تكراري: عند اللقاء بـ Promise يستنتج النوع الداخلي بـ infer ثم يستدعي Awaited عليه مجددًا حتى يتبقى شيء ليس Promise. وهذه هي الآلية نفسها التي يستخدمها TS داخليًا لاستنتاج نوع تعبيرات await.
⚠️ تنبيه يفك الـ Awaited على مستوى النوع فقط ولا ينتظر نيابة عنك. فنسيان await في التشغيل يعيد كائن Promise كما هو — صحّة النوع لا تعني أنك كتبت await.
💡 تلميح تراكيب مفيدة: Awaited<ReturnType<typeof fn>> يستخرج نتيجة نجاح دالة async؛ وفي نوع نتيجة Promise.all يُفك كل عضو عبر Awaited أيضًا.
المزيد من الحالات قادم قريبًا.

📚 دروس ذات صلة

❓ أسئلة شائعة

س ما الفرق بين Awaited<T> و T extends Promise<infer U>؟
ج النوع الشرطي غير التكراري المكتوب يدويًا يفك طبقة واحدة فقط ويعطب مع Promise<Promise<T>> المتداخلة؛ أما Awaited الرسمية فتفك تكراريًا وتدعم أيضًا الـ thenable (الكائنات ذات المنهج then المخصص). فضّل Awaited من أجل العمومية.
س ماذا يحدث عند الانتظار (await) لقيمة عادية؟
ج في التشغيل يعيد await قيمة غير الـ Promise كما هي؛ وعلى مستوى النوع يكون Awaited<string> أيضًا string. لذا فاستنتاج أنواع القيم «التي قد تكون Promise» بـ Awaited آمن دائمًا.
س كيف آخذ نوع نتيجة Promise.all؟
ج لا حاجة لكتابته يدويًا: عندما يستقبل Promise.all صفًا فنوع الإرجاع تلقائيًا صف ناتج عن فك كل عضو بـ Awaited. وللإشارة إلى هذا النوع أعلن const results = await Promise.all([...]) ثم استخدم typeof results.
Web-Tutorial.com

فريق Web-Tutorial التقني

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

100%