0Pricing
TypeScript Academy · درس

الشروط على مستوى النوع

فرّعوا اعتمادًا على الأنواع باستخدام تعبيرات الأنواع الشرطية

الشروط على مستوى النوع درس مجاني في TypeScript Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في TypeScript Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة TypeScript Academy 4 دروس في المجموع.

عبارة if على مستوى الأنواع

تكتسب لغة الأنواع التفرّع باستخدام الأنواع الشرطية. تُقرأ الصياغة T extends U ? X : Y كما يلي: إذا كان T قابلًا للإسناد إلى U، فالنتيجة هي X، وإلا فهي Y.

وهذا هو المكافئ على مستوى الأنواع لتعبير if / else.

type IsString<T> = T extends string ? "yes" : "no";

type A = IsString<string>; // "yes"
type B = IsString<number>; // "no"

extends يعني قابلًا للإسناد

لا يختبر الشرط التساوي. يكون T extends U صحيحًا عندما يمكن استخدام قيمة من النوع T في موضع يُتوقع فيه النوع U. وتكون الأنواع الحرفية قابلة للإسناد إلى نوعها الأساسي.

type T1 = "hello" extends string ? true : false; // true
type T2 = string extends "hello" ? true : false; // false
type T3 = 42 extends number ? true : false;       // true

اختيار نوع النتيجة

تتيح الأنواع الشرطية لنوع عام واحد إرجاع بُنى مختلفة حسب المدخل. هنا يغلّف Wrap المصفوفات بطريقة مختلفة عن القيم المفردة.

type Wrap<T> = T extends unknown[]
  ? { list: T }
  : { value: T };

type A = Wrap<number>;   // { value: number }
type B = Wrap<string[]>; // { list: string[] }

التصفية إلى never

من الحيل الشائعة إرجاع never في أحد الفرعين. يعني never «لا قيمة»، ولذلك يفيد في إزالة أعضاء الاتحادات لاحقًا.

type OnlyStrings<T> = T extends string ? T : never;

type A = OnlyStrings<string>; // string
type B = OnlyStrings<number>; // never

الاستدلال باستخدام infer

تظهر القوة الحقيقية مع الكلمة المفتاحية infer. ففي داخل نوع شرطي، تنشئ infer متغير نوع جديدًا يلتقط جزءًا من النوع المطابق.

نلتقط هنا نوع عناصر مصفوفة.

type ElementType<T> = T extends (infer U)[] ? U : never;

type A = ElementType<number[]>; // number
type B = ElementType<string[]>; // string

استنتاج نتائج الدوال

يمكنك وضع infer في أي موضع داخل النمط. ولاستخراج نوع القيمة المرجعة لدالة، استنتج الجزء الواقع بعد السهم. هكذا تعمل الأداة المضمّنة ReturnType.

type MyReturn<T> = T extends (...args: any[]) => infer R ? R : never;

type A = MyReturn<() => number>;      // number
type B = MyReturn<(x: string) => boolean>; // boolean

استنتاج عدة أجزاء

يمكن لنوع شرطي واحد تقديم عدة متغيرات infer في الوقت نفسه. ننتزع هنا العنصر الأول وبقية الصف.

type FirstRest<T> = T extends [infer H, ...infer R]
  ? { head: H; rest: R }
  : never;

type A = FirstRest<[1, 2, 3]>;
// { head: 1; rest: [2, 3] }

الأنواع الشرطية المتداخلة

تتداخل الأنواع الشرطية مثل سلسلة من عبارات else if. ويمكن أن يكون فرع else في نوع شرطي ما نوعًا شرطيًا آخر، لتكوين سلّم من القرارات.

type Describe<T> =
  T extends string ? "text" :
  T extends number ? "num" :
  T extends boolean ? "flag" :
  "other";

type A = Describe<number>; // "num"
type B = Describe<null>;   // "other"

الشروط بوصفها حواجز

استخدم نوعًا شرطيًا للتحقق من بنية ما قبل استخراج عناصرها. إذا لم يطابق المدخل النمط، فارجع إلى never حتى يظهر الاستخدام غير الصحيح.

type GetName<T> = T extends { name: infer N } ? N : never;

type A = GetName<{ name: string }>; // string
type B = GetName<{ age: number }>;  // never

دمج الشروط

يمكنك اشتراط عدة شروط بتداخلها. يجب أن يكون النوع هنا كائنًا وأن يحتوي على id حتى يمر.

type RequireId<T> =
  T extends object
    ? T extends { id: unknown } ? T : never
    : never;

type A = RequireId<{ id: 1; x: 2 }>; // { id: 1; x: 2 }
type B = RequireId<{ x: 2 }>;        // never

الأنواع الشرطية موجودة في كل مكان

معظم أنواع الأدوات المضمّنة هي أنواع شرطية في جوهرها: NonNullable وExtract وExclude وParameters وReturnType. إن فهمت extends ? : فقد فتحت الطريق إلى فهمها جميعًا.

type MyNonNullable<T> = T extends null | undefined ? never : T;

type A = MyNonNullable<string | null>; // string

اختبار سريع

اختبر فهمك للأنواع الشرطية وinfer.

مراجعة

تمنح الأنواع الشرطية لغة الأنواع صيغة if/else ومطابقة الأنماط.

  • تُفرّع T extends U ? X : Y بناءً على قابلية الإسناد.
  • تلتقط infer الأجزاء المطابقة في متغيرات جديدة.
  • تتداخل الأنواع الشرطية لتكوين سلالم من القرارات.
  • تؤدي إعادة never إلى تصفية الأعضاء وإزالتها.

التالي: تمرير نوع شرطي إلى نفسه لإنشاء الاستدعاء الذاتي.

الأسئلة الشائعة

هل درس «الشروط على مستوى النوع» مجاني؟

نعم — نص درس «الشروط على مستوى النوع» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة TypeScript Academy، انتقل إلى CoddyKit PRO. تتضمن دورة TypeScript Academy 4 دروس في المجموع.

ماذا ستتعلم في «الشروط على مستوى النوع»؟

فرّعوا اعتمادًا على الأنواع باستخدام تعبيرات الأنواع الشرطية تتمرن على TypeScript Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ TypeScript Academy؟

لا تُشترط خبرة سابقة. TypeScript Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «الشروط على مستوى النوع»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس TypeScript Academy هذا؟

نعم. كل درس في TypeScript Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. الأنواع كلغة للحساب
  2. الشروط على مستوى النوع
  3. التكرار على مستوى النوع
  4. الأنواع الشرطية التوزيعية
← العودة إلى TypeScript Academy