function <T> الدوال العامة
آخر تحديث: 2026-10-22
function <T> الدوال العامة
تحول الدوال العامة معامل النوع <T> «النوعَ» إلى معامل: نفس المنطق يتكيف مع أنواع متعددة مع بقاء نوع المعامل ونوع الإرجاع مترابطين. وهي أأمن من any (لأنها تحفظ معلومات النوع) وأبسط من نسخ نفس الكود لكل نوع.
| المجموعة | الأنواع العامة |
|---|---|
| النوع | بناء الجملة |
| الوضع الصارم | غير مطلوب |
ℹ️ معلومة يحوّل المحرر لغة TypeScript إلى JavaScript ثم يشغّلها (بدون فحص أنواع)؛ راجع ناتج كل مثال لنتيجة فحص الأنواع.
📝 الصيغة
function identity<T>(value: T): T {
return value;
}
// معاملات نوع متعددة + قيود
function pick<T, K extends keyof T>(obj: T, keys: K[]): Pick<T, K>;
⚙️ المعاملات
| <T> | يُستنتج من المعاملات عند الاستدعاء أو يُحدد صراحةً؛ واصطلاح التسمية: T/U/V للأنواع العامة وK للمفاتيح وE للعناصر |
|---|---|
| K extends keyof T | القيد: K لا يكون إلا اسمًا من أسماء مفاتيح T، واسم المفتاح الخارج عن الحدود خطأ ترجمة |
القيمة المُعادة:يُعبَّر عنه بمعاملات الأنواع — فيمكن لقيمة الإرجاع أن تكون من نفس نوع المعامل (T) أو مشتقة وفق المفاضلة/الفهرسة (Pick<T, K>).
▶ مثال
عدّل الكود أدناه واضغط «جرّب» لرؤية نتيجة التحويل:
الناتج:
{"id":1,"name":"Charlie"}
(مخرجات التشغيل بعد التحويل؛ تمرير "age" إلى keys سيعطي خطأ نوع — K مقيّد بـ keyof T)
💡 نقاط مهمة
ℹ️ معلومة تختفي الأنواع العامة تمامًا بعد التحويل — فلا وجود لـ T في وقت التشغيل بل دالة عادية فقط؛ ويرتبط النوع كله في وقت الترجمة.
💡 تلميح حاول التعبير عن نوع الإرجاع بمعاملات الأنواع (مثل Pick<T, K>) بدل كتابة نوع إرجاع واسع يدويًا — فيحصل المستدعي على «النوع الدقيق المترابط».
⚠️ تنبيه الأنواع العامة ليست أفضل بقدر أكبر: عندما يكفي نوع واحد فإن كتابة T تزيد كلفة القراءة؛ اكتب النسخة المحددة أولًا ثم جردّها إلى عام عند ظهور التكرار.
🏷️ الأنواع العامة ذات صلة
💡 حالات ذات صلة
المزيد من الحالات قادم قريبًا.
📚 دروس ذات صلة
❓ أسئلة شائعة
س ما الفرق بين الأنواع العامة و any؟
ج any يمحو معلومات النوع (ينفصل المعامل عن قيمة الإرجاع ويختفي أي فحص لاحق)؛ أما الأنواع العامة فتحفظ ترابط النوع (قيمة الإرجاع من identity(42) هي number). فالأنواع العامة هي «البديل الآمن لـ any».
س متى يجب كتابة الدالة عامة؟
ج عندما «يتعلق نوع المعامل بنوع القيمة المُعادة» أو «يحتاج نفس المنطق إلى التكيف مع أنواع متعددة». والعلامة النموذجية: أنت على وشك كتابة any، أو تنسخ نفس الدالة لأنواع مختلفة.
س كيف يُقرأ <T, K extends keyof T>؟
ج تصريح معاملَي نوع: T نوع عشوائي، وK أحد مفاتيح T (مقيّد بـ keyof T). وعند الاستدعاء pick(user, ["id"]) يكون T هو نوع user وK هو "id"، ويكون نوع القيمة المُعادة هو { id: number }.