التكرار على مستوى النوع
كرّروا على الأنواع باستخدام الأنواع الشرطية التكرارية
التكرار على مستوى النوع درس مجاني في TypeScript Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في TypeScript Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة TypeScript Academy 4 دروس في المجموع.
الاستدعاء الذاتي في الأنواع
يمكن لنوع شرطي أن يشير إلى نفسه. وهذا يمنح لغة الأنواع حلقات تكرار. يمرّ معظم الاستدعاء الذاتي على مستوى الأنواع عبر tuple عنصرًا تلو الآخر، فيفصل العنصر الأول ويستدعي نفسه على بقية العناصر.
type Length<T extends unknown[]> =
T extends [unknown, ...infer Rest]
? Length<Rest>
: 0;
// (this counts down to a base case)حالة الأساس
يحتاج كل استدعاء ذاتي إلى شرط توقف. وغالبًا ما يكون هو الصف الفارغ في حالة الصفوف. عندما لا يعود النمط [head, ...rest] مطابقًا، تكون قد وصلت إلى النهاية وتعيد نتيجة ثابتة.
type IsEmpty<T extends unknown[]> =
T extends [] ? true : false;
type A = IsEmpty<[]>; // true
type B = IsEmpty<[1, 2]>; // falseالعنصر الأول وبقية العناصر
تتمثل الخطوة الأساسية في تقسيم الصف إلى عنصره الأول والصف المتبقي، باستخدام infer مع نمط الانتشار.
type Head<T extends unknown[]> = T extends [infer H, ...unknown[]] ? H : never;
type Tail<T extends unknown[]> = T extends [unknown, ...infer R] ? R : [];
type A = Head<[1, 2, 3]>; // 1
type B = Tail<[1, 2, 3]>; // [2, 3]معالجة العناصر واحدًا تلو الآخر
اجمع بين العنصر الأول، والصف المتبقي، والاستدعاء الذاتي لتحويل صف كامل. يعيد ToStrings بناء الصف، مستبدلًا نوع كل عنصر بـ string.
type ToStrings<T extends unknown[]> =
T extends [infer H, ...infer R]
? [string, ...ToStrings<R>]
: [];
type A = ToStrings<[1, true, 3]>; // [string, string, string]نمط المراكِم
غالبًا ما تبني النتيجة في معلمة إضافية تُسمى المراكِم. تبدأ فارغة وتنمو في كل خطوة. ويؤدي ذلك إلى تجنب إعادة المرور على البنية، وهو الأسلوب القياسي للحلقات على مستوى الأنواع.
type Reverse<T extends unknown[], Acc extends unknown[] = []> =
T extends [infer H, ...infer R]
? Reverse<R, [H, ...Acc]>
: Acc;
type A = Reverse<[1, 2, 3]>; // [3, 2, 1]تتبّع المراكِم
تتبّع Reverse<[1,2,3]>:
- الخطوة 1: H=1، يصبح Acc [1]
- الخطوة 2: H=2، يصبح Acc [2,1]
- الخطوة 3: H=3، يصبح Acc [3,2,1]
- الصف فارغ، أعد Acc = [3,2,1]
يحمل المراكِم النتيجة خلال كل استدعاء ذاتي.
type R = Reverse<["a", "b"]>; // ["b", "a"]الاستدعاء الذاتي على الاتحادات
يمكنك أيضًا استخدام الاستدعاء الذاتي لضم اتحاد من السلاسل النصية. نربط هنا عناصر الصف في سلسلة نصية حرفية واحدة، مع فصلها بمحدد.
ملاحظة: تكتب TypeScript فعليًا الأنواع الحرفية للقوالب النصية باستخدام سلاسل محاطة بعلامات backtick وتحتوي على مواضع ${}. نعرض هذا النمط في هذه المقاطع بصيغة Tpl<...>، مع سرد كل جزء بالترتيب؛ فمثلًا يظهر قالب backtick الذي يطابق البادئة الحرفية ثم Rest بصيغة Tpl<'prefix', infer Rest>.
type Join<T extends string[], Sep extends string = ','> =
T extends [infer H extends string, ...infer R extends string[]]
? R extends []
? H
: Tpl<H, Sep, Join<R, Sep>>
: '';
// Tpl<H, Sep, ...> builds a template literal type joining the parts
type A = Join<['a', 'b', 'c']>; // 'a,b,c'العد باستخدام الاستدعاء الذاتي
يمكن للاستدعاء الذاتي مع المراكِم إجراء العد. أنشئ صفًا من unknown بالطول نفسه لطول المدخل، ثم اقرأ الخاصية length لاحقًا. وستستخدم هذا كثيرًا في دورة الحساب.
type Count<T extends unknown[], Acc extends unknown[] = []> =
T extends [unknown, ...infer R]
? Count<R, [unknown, ...Acc]>
: Acc["length"];
type A = Count<["x", "y", "z"]>; // 3التصفية باستخدام الاستدعاء الذاتي
مرّر على صف واحتفظ بالعناصر التي تطابق شرطًا فقط، مع إسقاط العناصر الأخرى. لتجاوز عنصر، لا تضفه إلى المراكِم.
type KeepStrings<T extends unknown[], Acc extends unknown[] = []> =
T extends [infer H, ...infer R]
? H extends string
? KeepStrings<R, [...Acc, H]>
: KeepStrings<R, Acc>
: Acc;
type A = KeepStrings<[1, "a", 2, "b"]>; // ["a", "b"]حدود عمق الاستدعاء الذاتي
يضع المترجم حدًا لعمق الاستدعاء الذاتي، كان تاريخيًا نحو 50، مع السماح بتحسينات الاستدعاء الذاتي الذّيلي بعمق أكبر في بعض الأنماط. وقد تواجه في الصفوف الكبيرة جدًا الخطأ Type instantiation is excessively deep. استخدم أسلوب المراكِم، أي الأسلوب الذّيلي، لرفع هذا الحد.
type Repeat<T, N extends number, Acc extends T[] = []> =
Acc["length"] extends N ? Acc : Repeat<T, N, [...Acc, T]>;
type A = Repeat<0, 3>; // [0, 0, 0]جمع الأجزاء معًا
يُعدّ تقسيم العنصر الأول وبقية العناصر، وحالة الأساس، والمراكِم المكونات الثلاثة لكل حلقة تقريبًا على مستوى الأنواع. وباستخدامها، يمكنك تعيين الصفوف وتصفيتها وعكسها وعدّها وضمها بالكامل داخل نظام الأنواع.
type MapToPairs<T extends unknown[], Acc extends unknown[] = []> =
T extends [infer H, ...infer R]
? MapToPairs<R, [...Acc, [H, H]]>
: Acc;
type A = MapToPairs<[1, 2]>; // [[1, 1], [2, 2]]اختبار سريع
اختبر فهمك لنمط المراكِم.
مراجعة
يمكنك الآن كتابة حلقات على مستوى الأنواع.
- تنشئ الأنواع الشرطية التي تشير إلى نفسها استدعاءً ذاتيًا.
- قسّم الصفوف إلى
[H, ...R]واستدعِ النوع ذاتيًا على بقية العناصر. - توقف حالة الأساس، وهي الصف الفارغ، الحلقة.
- يبني المراكِم النتيجة ويتيح الاستدعاء الذاتي العميق.
التالي: كيف تتصرف الأنواع الشرطية بطريقة خاصة مع الاتحادات.
الأسئلة الشائعة
هل درس «التكرار على مستوى النوع» مجاني؟
نعم — نص درس «التكرار على مستوى النوع» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة TypeScript Academy، انتقل إلى CoddyKit PRO. تتضمن دورة TypeScript Academy 4 دروس في المجموع.
ماذا ستتعلم في «التكرار على مستوى النوع»؟
كرّروا على الأنواع باستخدام الأنواع الشرطية التكرارية تتمرن على TypeScript Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ TypeScript Academy؟
لا تُشترط خبرة سابقة. TypeScript Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «التكرار على مستوى النوع»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس TypeScript Academy هذا؟
نعم. كل درس في TypeScript Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- الأنواع كلغة للحساب
- الشروط على مستوى النوع
- التكرار على مستوى النوع
- الأنواع الشرطية التوزيعية