استبعاد الحقول من النوع في TypeScript: دليل بسيط

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

كيفية استبعاد خاصية من النوع في TypeScript: إنقاذ الكود من الحمولة الزائدة

\n\n

هل سبق لك أن واجهت موقفًا حيث لديك واجهة أو نوع كبير، وتحتاج إلى إنشاء نوع جديد مشابه تقريبًا ولكن بدون حقل أو حقلين؟ هل تكرر الكود بأكمله؟ هل تنسخ 15 سطرًا وتحذف واحدًا؟ هناك طريقة أكثر أناقة. اليوم سنشرح كيفية استبعاد خاصية من النوع في TypeScript - وهي واحدة من أكثر الأدوات المساعدة شيوعًا التي تنقذ من التكرار وتجعل الكود أنظف.

\n\n

هذا الموضوع هو من أكثر المواضيع رواجًا على Stack Overflow. سؤال "Exclude property from type" يحصل على آلاف المشاهدات، لأن كل مطور عاجلاً أم آجلاً يواجه الحاجة إلى إزالة حقل من النوع أو استبعاد خاصية من الواجهة. دعنا نتعلم بالترتيب، بدءًا من الأمثلة البسيطة وصولاً إلى التقنيات المتقدمة.

\n\n

المشكلة: لماذا نستبعد الحقول من النوع؟

\n\n

تخيل أن لديك واجهة User:

\n\n
interface User {\n  id: number;\n  name: string;\n  email: string;\n  password: string;\n  createdAt: Date;\n}
\n\n

تريد إنشاء نموذج تسجيل، حيث يدخل المستخدم الاسم والبريد الإلكتروني وكلمة المرور. لكن id يتم إنشاؤه على الخادم، و createdAt تلقائيًا. تحتاج إلى نوع NewUser الذي يحتوي فقط على name و email و password. كيف تفعل ذلك؟

\n\n

الحل السيئ هو تعريف واجهة جديدة من الصفر:

\n\n
interface NewUser {\n  name: string;\n  email: string;\n  password: string;\n}
\n\n

هذا يعمل، لكنه ينتهك مبدأ DRY (Don't Repeat Yourself). إذا غيرنا نوع name في User، فسيتعين علينا تغييره أيضًا في NewUser. وهنا يأتي دور استبعاد الخصائص من النوع.

\n\n

النوع المساعد Omit: الأداة الرئيسية

\n\n

يوفر TypeScript النوع المساعد المدمج Omit<Type, Keys>. ينشئ نوعًا جديدًا عن طريق استبعاد المفاتيح المحددة من النوع الأصلي. الصيغة بسيطة:

\n\n
type NewUser = Omit<User, 'id' | 'createdAt'>;
\n\n

الآن NewUser يحتوي فقط على name و email و password. إذا غيرنا email إلى Email في User، فإن NewUser سيلتقط ذلك تلقائيًا.

\n\n

دعنا نتحقق عمليًا:

\n\n
const newUser: NewUser = {\n  name: 'آنا',\n  email: 'anna@example.com',\n  password: 'secure123'\n}; // ✅ كل شيء جيد\n\nconst invalidUser: NewUser = {\n  name: 'آنا',\n  email: 'anna@example.com',\n  password: 'secure123',\n  id: 1 // ❌ خطأ: id غير موجود في النوع NewUser\n};
\n\n

ملاحظة: Omit يعمل مع كل من الواجهات والأنواع. إنها أداة عالمية لـ استبعاد الحقول من النوع.

\n\n

كيف يعمل Omit من الداخل؟

\n\n

لفهم أفضل لكيفية استبعاد TypeScript للخصائص من النوع، دعنا نلقي نظرة من الداخل. Omit هو مزيج من أداتين مساعدتين أخريين: Pick و Exclude.

\n\n

هكذا تم تعريفه في المكتبة القياسية لـ TypeScript:

\n\n
type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;
\n\n

دعنا نحللها خطوة بخطوة:

\n
    \n
  • keyof T - يحصل على جميع مفاتيح النوع T (مثل 'id' | 'name' | 'email' | 'password' | 'createdAt')
  • \n
  • Exclude<keyof T, K> - يستبعد من هذه المفاتيح تلك المحددة في K (نحصل على 'name' | 'email' | 'password')
  • \n
  • Pick<T, ...> - يختار من T فقط المفاتيح المتبقية
  • \n
\n\n

وبالتالي، فإن استبعاد خاصية من الواجهة يتحول إلى تصفية المفاتيح. أنيق، أليس كذلك؟

\n\n

Pick: الجانب الآخر من Omit

\n\n

أحيانًا يكون من الأسهل عدم الاستبعاد، بل الع

المدونات

توصيات الكتب