الانتقال إلى المحتوى الرئيسي
الوحدة 3 · الدرس 2 من 26/14 في الدورة~15 min
دروس الوحدة (2/2)

الأدوية العامة الأساسية

الأسماء العامة (البرمجة العامة) هي إحدى أقوى ميزات TypeScript. إنها تسمح لك بكتابة مكونات ووظائف وواجهات مرنة وقابلة لإعادة الاستخدام يمكنها العمل مع أنواع مختلفة من البيانات مع الحفاظ على الحد الأقصى من أمان النوع وتجنب استخدام any.


وظائف عامة

فكر في عام كمتغير للأنواع. لنفكر في دالة تُرجع القيمة التي تم تمريرها إليها كوسيطة:

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

الحرف T (اختصار لـ Type) هو عنصر نائب للنوع. عندما نستدعي identity، يلتقط TypeScript نوع الوسيط الذي تم تمريره ويقوم تلقائيًا بتعيين T على هذا النوع:

TS
const str = identity<string>('Hello'); // T is string
const num = identity(42); // T is number (automatically inferred!)

الواجهات العامة والأسماء المستعارة

يمكن أيضًا تطبيق الأدوية العامة على الواجهات وكتابة الأسماء المستعارة لتحديد الحاويات العامة أو هياكل البيانات:

TS
interface Box<T> {
  content: T;
}

const stringBox: Box<string> = { content: 'TypeScript' };
const numberBox: Box<number> = { content: 42 };

معلمات نوع متعددة

يمكننا تعريف الوظائف أو الأنواع التي تستخدم متغيرات أنواع متعددة (على سبيل المثال، T و U):

TS
function mergeObjects<T, U>(obj1: T, obj2: U): T & U {
  return { ...obj1, ...obj2 };
}

القيود العامة

في بعض الأحيان نريد تحديد الأنواع التي يقبلها النوع العام. يمكننا استخدام الكلمة الأساسية extends لإضافة قيد.

على سبيل المثال، إذا أردنا أن يكون للنوع العام دائمًا خاصية length (مثل السلاسل أو المصفوفات):

TS
interface HasLength {
  length: number;
}

function logLength<T extends HasLength>(arg: T): void {
  console.log(arg.length); // Safe! We know arg has 'length'
}

logLength('Hello'); // Valid
logLength([1, 2, 3]); // Valid
// logLength(42); // Error: number does not have a length property!

جربه بنفسك

التمرين 1: وظيفة الهوية العامة

تمرين#ts.m3.l2.e1
المحاولات: 0جارٍ التحميل…

أكمل وظيفة الهوية العامة بحيث تقبل معلمة قيمة من النوع العام T وتعيدها دون تعديل.

جارٍ تحميل المحرر…
إظهار التلميح

يجب أن يكون نوع الإرجاع هو نفس النوع العام T مثل المعلمة.

الحل متاح بعد 3 من المحاولات

التمرين 2: غلاف الصندوق العام

تمرين#ts.m3.l2.e2
المحاولات: 0جارٍ التحميل…

حدد واجهة عامة باسم Box تقبل معلمة النوع T ولها خاصية واحدة تسمى محتوى من النوع T.

جارٍ تحميل المحرر…
إظهار التلميح

استخدم الواجهة Box<T> { content: T; } بناء الجملة.

الحل متاح بعد 3 من المحاولات

التمرين 3: القيد العام

تمرين#ts.m3.l2.e3
المحاولات: 0جارٍ التحميل…

اكتب دالة عامة باسم getLength تقبل المعلمة arg. يجب أن يكون arg مقيدًا بواجهة لها خاصية الطول (الرقم). يجب أن تقوم الدالة بإرجاع arg.length.

جارٍ تحميل المحرر…
إظهار التلميح

قم بتعريف الدالة كـ getLength<T Extends HasLength>(arg: T): number وإرجاع arg.length.

الحل متاح بعد 3 من المحاولات

التمرين 4: الزوج العام

تمرين#ts.m3.l2.e4
المحاولات: 0جارٍ التحميل…

حدد واجهة عامة زوج<T, U> بخاصيتين: الأولى من النوع T والثانية من النوع U. بعد ذلك، قم بإنشاء دالة عامة makePair التي تقبل الأول (من النوع T) والثانية (من النوع U) وترجع كائنًا ينفذ Pair<T, U>.

جارٍ تحميل المحرر…
إظهار التلميح

استخدم بناء الجملة لمعلمتين عامتين Pair<T, U> وحدد makePair وفقًا لذلك.

الحل متاح بعد 3 من المحاولات