0Pricing
TypeScript Academy · درس

أدوات الأنواع الرقمية العملية

طبّقوا الحساب النوعي على قيود النطاق والطول

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

من النظرية إلى الأدوات

تصبح الحسابات والمقارنات مفيدة عند تغليفها في أدوات عملية: النطاقات، والمصفوفات المفروضة الطول، والفهارس المقيدة. يحوّل هذا الدرس البدائيات إلى أشياء يمكنك شحنها فعليًا.

type BuildTuple<N extends number, Acc extends unknown[] = []> =
  Acc["length"] extends N ? Acc : BuildTuple<N, [...Acc, unknown]>;

التعداد: من 0 إلى N-1

ينتج أحد المساعدات الأساسية اتحادًا يضم كل الأرقام من 0 إلى N-1. ابنِ tuple بطول N واقرأ كل فهرس كمفتاح.

type Enumerate<N extends number, Acc extends number[] = []> =
  Acc["length"] extends N
    ? Acc[number]
    : Enumerate<N, [...Acc, Acc["length"]]>;

type A = Enumerate<4>; // 0 | 1 | 2 | 3

أنواع النطاقات

ينتج Range<Start, End> الأرقام من Start حتى End - 1. خذ Enumerate<End> واستبعد القيم الأصغر من Start.

type Range<S extends number, E extends number> =
  Exclude<Enumerate<E>, Enumerate<S>>;

type A = Range<2, 6>; // 2 | 3 | 4 | 5

تقييد وسيط

استخدم نطاقًا لتقييد الوسيطات الصالحة. يمكن لدالة لا تقبل إلا نتيجة رمية نرد صغيرة أن تستقبل Range<1, 7>، وبذلك يرفض المصرّف القيم الخارجة عن الحدود.

type DiceFace = Range<1, 7>; // 1|2|3|4|5|6
declare function roll(face: DiceFace): void;
roll(4); // ok
// roll(8); // compile error

فرض طول المصفوفة

يرفض نوع المصفوفة ثابتة الطول المصفوفات ذات الأحجام الخاطئة. ابنِ tuple مكوّنًا من N عناصر من النوع T باستخدام الاستدعاء الذاتي.

type FixedArray<T, N extends number, Acc extends T[] = []> =
  Acc["length"] extends N ? Acc : FixedArray<T, N, [...Acc, T]>;

type RGB = FixedArray<number, 3>; // [number, number, number]

استخدام الطول الثابت

أصبح سوء الاستخدام الآن خطأً في وقت الترجمة. يجب أن تحتوي نقطة ثلاثية الأبعاد على ثلاثة إحداثيات بالضبط.

type Vec3 = FixedArray<number, 3>;
const v: Vec3 = [1, 2, 3]; // ok
// const w: Vec3 = [1, 2]; // error: missing element

تقييد الفهارس

يمكنك تقييد نوع الفهرس ليقتصر على مواضع المصفوفة الصالحة. ادمج طول tuple مع Enumerate بحيث لا تُقبل إلا الفهارس الواقعة ضمن الحدود.

type Indices<T extends readonly unknown[]> = Enumerate<T["length"]>;

type Arr = readonly ["a", "b", "c"];
type I = Indices<Arr>; // 0 | 1 | 2

الوصول الآمن باستخدام الفهرس

باستخدام نوع فهرس صالح، يمكنك كتابة دالة getter لا يمكن لوسيط فهرسها تجاوز الحدود، وبذلك تلتقط أخطاء الفرق بمقدار واحد في وقت الترجمة.

declare function at<T extends readonly unknown[]>(
  arr: T,
  i: Indices<T>
): T[Indices<T>];

const x = at(["a", "b", "c"] as const, 2); // ok
// at(["a", "b", "c"] as const, 3); // error

مساعدا Min وMax

أضف المقارنة لاختيار الأكبر أو الأصغر من رقمين، وهو أمر مفيد لتقييد قيمة ضمن نطاق.

type Max<A extends number, B extends number> =
  GreaterThan<A, B> extends true ? A : B;
type Min<A extends number, B extends number> =
  GreaterThan<A, B> extends true ? B : A;

type X = Max<3, 8>; // 8
type Y = Min<3, 8>; // 3

تركيب الأدوات

يمكن دمج هذه الأدوات. فـtuple بطول يقع ضمن نطاق، وفهرس مقيّد ضمن مصفوفتها، وقيمة محصورة بين الحدين الأدنى والأقصى: كل منها دالة صغيرة قابلة لإعادة الاستخدام على مستوى الأنواع.

type ValidPort = Range<1, 4>; // 1 | 2 | 3 (toy example)
type Slots = FixedArray<ValidPort, 2>; // [1|2|3, 1|2|3]

متى يستحق الأمر ذلك

تتألق الحسابات على مستوى الأنواع مع الحدود الصغيرة الثابتة: tuples ألوان RGB، وأوجه النرد، وإحداثيات اللوحة، وأحجام حقول البروتوكول. لكنها لا تستحق العناء مع الأرقام الكبيرة أو الديناميكية، حيث تفوق حدود الاستدعاء الذاتي والتعقيد الفائدة الأمنية. استخدمها عندما يكون الحد صغيرًا ويكون الضمان مهمًا.

type Board = FixedArray<FixedArray<0 | 1, 3>, 3>; // 3x3 grid

تحقق سريع

اختبر مدى فهمك للأدوات الرقمية العملية.

مراجعة

لقد بنيت مكتبة صغيرة من الأدوات الرقمية على مستوى الأنواع.

  • ينتج Enumerate وRange اتحادات من الأرقام.
  • يفرض FixedArray أطوالًا دقيقة.
  • يقيّد Indices الوصول إلى المواضع الصالحة.
  • يحدّد Min/Max القيم.

استخدمها مع الحدود الصغيرة الثابتة. التالي: الدورة 23، محاكاة الأنواع عالية الرتبة.

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

هل درس «أدوات الأنواع الرقمية العملية» مجاني؟

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

ماذا ستتعلم في «أدوات الأنواع الرقمية العملية»؟

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

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

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

كم من الوقت يستغرق درس «أدوات الأنواع الرقمية العملية»؟

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

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

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

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

  1. العد باستخدام طول الصفيفة
  2. الجمع والطرح على مستوى النوع
  3. المقارنات على مستوى النوع
  4. أدوات الأنواع الرقمية العملية
← العودة إلى TypeScript Academy