class<T> الفئات العامة
آخر تحديث: 2026-10-22
class<T> الفئات العامة
تربط الفئة العامة (class Stack<T>) «بنية الفئة» بنوع البيانات المخزنة: فنسخة Stack<number> لا يمر منها إلا number داخلًا وخارجًا. ويمكن للحقول ومعاملات الطرق وقيم إرجاع الطرق جميعها الإشارة إلى T، فتبقى الحالة كلها آمنة نوعيًا.
| المجموعة | الأنواع العامة |
|---|---|
| النوع | بناء الجملة |
| الوضع الصارم | غير مطلوب |
ℹ️ معلومة يحوّل المحرر لغة TypeScript إلى JavaScript ثم يشغّلها (بدون فحص أنواع)؛ راجع ناتج كل مثال لنتيجة فحص الأنواع.
📝 الصيغة
class Stack<T> {
private items: T[] = [];
push(item: T): void { this.items.push(item); }
pop(): T | undefined { return this.items.pop(); }
size(): number { return this.items.length; }
}
const numStack = new Stack<number>();
⚙️ المعاملات
| <T> | معامل النوع على مستوى الفئة: يُحدد عند new Stack<number>() ويُشترك فيه كل الفئة بنفس الـ T |
|---|---|
| pop(): T | undefined | قيمة الإرجاع تشير إلى T: فإخراج عنصر من المكدس الفارغ يعطي undefined، وهو معبَّر عنه بأمانة في النوع |
القيمة المُعادة:تنثبّت أنواع إرجاع الطرق وفق T للنسخة: فـ pop() في Stack<number> هي number | undefined.
▶ مثال
عدّل الكود أدناه واضغط «جرّب» لرؤية نتيجة التحويل:
الناتج:
2 1
build
(مخرجات التشغيل بعد التحويل؛ numStack.push("1") سيعطي خطأ ترجمة — فـ T لهذه النسخة مثبت على number)
💡 نقاط مهمة
ℹ️ معلومة T هو نفسه المتغير في كامل الفئة: ما تدفعه push هو ما تحصل عليه من pop — وهذا هو الاختلاف الجوهري بين الفئة العامة وحاوية any.
💡 تلميح الأعضاء الساكنون لا يمكنهم الإشارة إلى T الخاص بالفئة: فـ static على مستوى الفئة لا على مستوى النسخة؛ وإذا احتجت منطقًا عامًا ساكنًا فصرّح بمعاملات نوع خاصة لطريقة static.
⚠️ تنبيه معاملات النوع تعمل على جانب النسخة فقط: فـ Stack<number> و Stack<string> نوعان غير متوافقين، والإسناد بينهما يعطي خطأ.
🏷️ الأنواع العامة ذات صلة
💡 حالات ذات صلة
المزيد من الحالات قادم قريبًا.
📚 دروس ذات صلة
❓ أسئلة شائعة
س هل يجوز كتابة new Stack() دون <number>؟
ج نعم، عندما تسمح معاملات المُنشئ بالاستدلال يُحدد T تلقائيًا (new Stack([1, 2]) ← Stack<number>)؛ أما المُنشئ الفارغ فلا يمكن الاستدلال منه وستحصل على Stack<unknown>، وفي هذه الحالة يُفضَّل الكتابة صراحةً.
س كيف تُكتب وراثة الفئة العامة؟
ج إما أن يثبّت الصنف الفرعي T: class NumberStack extends Stack<number>؛ أو أن يحمل معامل نوعه الخاص: class Box<T> extends Stack<T> — ويجب أن يتمكن معامل الصنف الفرعي من إرضاء معامل الفئة الأصل.
س هل التعاون بين الفئات العامة والواجهات العامة شائع؟
ج شائع جدًا: interface Repo<T> تعرّف العقد، و class MemoryRepo<T> implements Repo<T> توفر التنفيذ — يبقى العقد والتنفيذ معًا عامين فيحصل مستوى الأعمال على أنواع دقيقة.