Kodokon kodokon.com

الأنواع العامة: دوال وأنواع عامة بسيطة

اكتب دوالًا وأنواعًا قابلة لإعادة الاستخدام تحافظ على دقة الأنواع كاملة في كل استدعاء.

9 دقيقة · 3 أسئلة

افتح هذا الدرس في Kodokon

أنت تستخدم الأنواع العامة بالفعل دون أن تدرك: string[]، Promise<number>... حان وقت كتابة أنواعك الخاصة. يُدخِل النوع العام معامل نوع، وهو متغير يُستبدَل بنوع محدد عند كل استخدام. الهدف: اكتب المنطق مرة واحدة، دون التضحية بدقة الأنواع.

TYPESCRIPT
function first<T>(items: T[]): T | undefined {
  return items[0];
}

const n = first([10, 20, 30]);
const s = first(["a", "b"]);
T مستنتَج: n من النوع number | undefined، وs من النوع string | undefined

لاحظ أنك لم تحدد شيئًا عند موضع الاستدعاء: يقوم TypeScript بـاستنتاج T من المعطى (argument). النوع العام غير المقيَّد يقبل أي شيء؛ ومع ذلك، كثيرًا ما تحتاج الدالة إلى حد أدنى من الضمانات حول بياناتها. تفرض كلمة extends شكلًا أدنى على T.

TYPESCRIPT
interface HasId {
  id: number;
}

function findById<T extends HasId>(
  items: T[],
  id: number
): T | undefined {
  return items.find((item) => item.id === id);
}
قيد: يجب أن يمتلك T على الأقل خاصية id رقمية

يمكن للأنواع نفسها أن تكون عامة. هذا هو الواقع اليومي في شيفرة الشبكة: بنية الاستجابة ثابتة، ولا يتغير سوى محتوى data. عندئذٍ يصف نوع واحد جميع استجابات واجهات API لديك.

TYPESCRIPT
interface ApiResponse<T> {
  ok: boolean;
  data: T;
}

type UserResponse = ApiResponse<{ name: string }>;

const res: UserResponse = {
  ok: true,
  data: { name: "Ada" },
};
نوع عام يجعل محتوى data معلمًا (parameterized)

اختبار المعرفة

تأكّد من أنك تذكّرت النقاط الأساسية في هذا الدرس.

  1. في function first<T>(items: T[]): T | undefined، ماذا يمثّل T؟
    • نوعًا محددًا معرَّفًا نهائيًا مرة واحدة
    • معامل نوع يُستبدَل عند كل استدعاء
    • النوع unknown
    • اختصارًا للنوع any
  2. ماذا يضمن القيد <T extends HasId>؟
    • أن T هو تمامًا النوع HasId
    • أن T يمتلك على الأقل خصائص HasId
    • أن T يرث من الصنف HasId
  3. تستدعي first([10, 20, 30]) دون تحديد نوع. ما هو T؟
    • any
    • unknown
    • number
    • 10 | 20 | 30