implements تحقيق الفئات للواجهات والفئة كنوع
آخر تحديث: 2026-10-22
implements تحقيق الفئات للواجهات والفئة كنوع
يجعل implements الفئة «تطالب» بواجهة: يتحقق المترجم بندًا بندًا من أن الفئة توفر كل الأعضاء التي تطلبها الواجهة وأنواعها متوافقة. تصف الواجهة «ما الذي يمكن فعله»، وتجيب الفئة «كيف يُفعل» — ويمكن للواجهة الواحدة أن تحققها تنفيذات مختلفة تمامًا.
| المجموعة | الدوال والأصناف |
|---|---|
| النوع | بناء الجملة |
| الوضع الصارم | غير مطلوب |
ℹ️ معلومة يحوّل المحرر لغة TypeScript إلى JavaScript ثم يشغّلها (بدون فحص أنواع)؛ راجع ناتج كل مثال لنتيجة فحص الأنواع.
📝 الصيغة
interface Storage {
save(key: string, value: string): void;
load(key: string): string | null;
}
class MemoryStorage implements Storage {
private map = new Map<string, string>();
save(key: string, value: string): void { this.map.set(key, value); }
load(key: string): string | null { return this.map.get(key) ?? null; }
}
⚙️ المعاملات
| implements | المطالبة بالواجهات: يجوز تحقيق عدة واجهات دفعة واحدة (implements A, B)؛ واتجاه الفحص هو «الفئة تحقق الواجهة» |
|---|---|
| extends + implements | يجوز الجمع بينهما: class Foo extends Base implements Storage — وراثة التنفيذ مع تحمّل العقد |
القيمة المُعادة:يجب أن تتطابق أنواع إرجاع الطرق مع توقيعات الواجهة أو تكون أضيق منها (تغاير)، بينما تتطلب المعاملات أن تكون أوسع (تباين)، وإلا كان خطأ ترجمة.
▶ مثال
عدّل الكود أدناه واضغط «جرّب» لرؤية نتيجة التحويل:
الناتج:
dark null
(مخرجات التشغيل بعد التحويل؛ حذف طريقة load أو تغيير نوع إرجاعها إلى string سيعطي خطأ ترجمة — فـ implements يفحص بندًا بندًا)
💡 نقاط مهمة
ℹ️ معلومة implements فحص خاص بوقت الترجمة بلا أي تأثير في بنية وقت التشغيل؛ فبعد التحويل تختفي الواجهة وتصبح الفئة فئة عادية.
⚠️ تنبيه الواجهات تصف الأعضاء العلنيين فقط — فالحقول الخاصة private لا تدخل في فحص implements؛ وعلى النقيض، كل عضو مكتوب في الواجهة يجب أن يوجد في الفئة كاملًا، ونقص واحد يعني خطأ.
💡 تلميح أسلوب تطبيق انعكاس التبعية عمليًا: يعتمد كود الأعمال على واجهة Storage، وتحقن الاختبارات MemoryStorage والإنتاج LocalStorage — دون تغيير سطر واحد في كود المستدعي.
🏷️ الدوال والأصناف ذات صلة
💡 حالات ذات صلة
المزيد من الحالات قادم قريبًا.
📚 دروس ذات صلة
❓ أسئلة شائعة
س ما الفرق بين implements و extends؟
ج extends يرث التنفيذ (يأخذ الكود)، بينما implements يعد بالشكل (يتحمل العقد). يمكن للفئة أن ترث extends فئة أم واحدة فقط، لكنها تحقق implements عدة واجهات.
س هل يمكن إسناد فئة إلى نوع واجهة دون implements؟
ج نعم — فـ TS نظام أنواع بنيوي، يكفي تطابق الشكل. وقيمة implements هي التصريح الصريح بالنية + جعل «الواجهة تغيّرت والفئة لم تلحق بها» خطأً يظهر عند تعريف الفئة بدل الانفجار عند مواضع الإسناد.
س هل يمكن تعريف قيود المُنشئ في الواجهة؟
ج نعم، بكتابة توقيع new: interface Ctor<T> { new (...args: any[]): T } — وهو شائع لأنواع تسجيل المصانع/الحاويات.