أنواع TypeScript العامة: كتابة كود مرن دون تكرار

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

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

ابدأ الدورة

مقدمة: لماذا يفقد TypeScript نصف قوته بدون الأنواع العامة؟



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



الأنواع العامة (Generics) هي آلية تسمح بإنشاء مكونات (دوال، كلاسات، واجهات) تعمل مع أنواع مختلفة، بدلاً من نوع واحد محدد. بدلاً من نسخ الكود، تكتبه مرة واحدة، ويتم تعيين النوع تلقائيًا. في هذه المقالة، سنشرح كيفية عمل البرمجة العامة في TypeScript، ونعرض أمثلة كود واقعية، ونقدم نصائح عملية تجعل كودك أنظف وأكثر أمانًا.



نحن PythonLib، ونتحدث اليوم عن TypeScript لأنه لا يمكن تصور تطوير الواجهات الأمامية الحديثة بدونه. هيا بنا!



ما هي الأنواع العامة في TypeScript ولماذا نحتاجها؟



لنبدأ بمثال بسيط. لنفترض أنك تريد كتابة دالة تُرجع الوسيط الذي تم تمريره إليها (دالة الهوية).



// بدون الأنواع العامة — نضطر لاستخدام anyfunction identity(arg: any): any {    return arg;}

// أو كتابة تحميلات زائدة لكل نوعfunction identityNumber(arg: number): number { return arg; }function identityString(arg: string): string { return arg; }


الخيار الأول يقتل التصنيف — تفقد معلومات النوع. الخيار الثاني يجعلك تنتج الكثير من الدوال المتطابقة. الأنواع العامة في TypeScript تحل هذه المشكلة بأناقة:



function identity<T>(arg: T): T {    return arg;}

const num = identity<number>(42); // نوع numberconst str = identity('hello'); // نوع string (استنتاج النوع)const bool = identity(true); // نوع boolean


الرمز <T> هو معامل النوع. يمكنك تسميته بأي اسم (غالبًا ما يستخدم T, U, V)، ولكن من الأفضل إعطاء أسماء ذات معنى إذا كان هناك العديد منها. عندما تستدعي الدالة، يقوم TypeScript بتعيين النوع الحقيقي بدلاً من T. إذا لم يتم تحديد النوع صراحةً، يقوم المترجم باستنتاجه تلقائيًا من الوسيط.



وبالتالي، الأنواع العامة (Generics) تسمح بالحفاظ على التصنيف الصارم حيث كان يجب سابقًا استخدام any. هذا يقلل من عدد الأخطاء ويجعل الكود موثقًا ذاتيًا.



بناء جملة الأنواع العامة: من البسيط إلى المعقد



الدوال العامة



لقد رأينا بالفعل المثال الأساسي. دعنا نعقده: دالة تأخذ مصفوفة وتُرجع عنصرها الأول.



function getFirst<T>(arr: T[]): T | undefined {    return arr[0];}

const firstNumber = getFirst([1, 2, 3]); // number | undefinedconst firstString = getFirst(['a', 'b', 'c']); // string | undefined


لاحظ: T[] هو اختصار لـ Array<T>. يمكنك استخدام أي صيغة.



الواجهات العامة



الواجهات ذات الأنواع العامة هي أداة قوية لوصف هياكل البيانات. على سبيل المثال، استجابة API مصنفة:



interface ApiResponse<T> {    data: T;    status: number;    message: string;}

// الاستخدامconst userResponse: ApiResponse<{ id: number; name: string }> = { data: { id: 1, name: 'Alice' }, status: 200, message: 'OK'};


الآن يمكن لواجهة واحدة أن تصف الاستجابات للمستخدمين والمنتجات والطلبات — فقط قم بتعيين النوع المناسب.



الكلاسات العامة



يمكن أن تكون الكلاسات عامة أيضًا. المثال الكلاسيكي هو قائمة الانتظار (Queue):



c                

المدونات

توصيات الكتب