أنواع الشرطية في TypeScript

توفر الأنواع الشرطية في TypeScript طريقة لإنشاء أنواع تعتمد على شرط. وهي تسمح بمرونة أكبر وتعبيرية في تعريفات الأنواع، مما يجعل من الممكن نمذجة علاقات الأنواع المعقدة بطريقة واضحة وموجزة. تستكشف هذه المقالة كيفية عمل الأنواع الشرطية في TypeScript وتقدم أمثلة لتوضيح استخدامها.

ما هي أنواع الشرطية؟

تتيح الأنواع الشرطية إنشاء أنواع يتم تحديدها بناءً على شرط. وهي تشبه العبارات الشرطية في البرمجة ولكنها تعمل على مستوى النوع. والبنية الأساسية للنوع الشرطي هي:

type ConditionalType = T extends U ? X : Y;

في هذا النحو:

  • T هو النوع الذي يتم فحصه.
  • U هو النوع الذي يجب المقارنة به.
  • X هو النوع الذي يتم إرجاعه إذا امتد T إلى U.
  • Y هو النوع الذي يتم إرجاعه إذا لم يمتد T إلى U.

مثال أساسي على الأنواع الشرطية

فيما يلي مثال بسيط لنوع شرطي يقوم بإرجاع أنواع مختلفة استنادًا إلى ما إذا كان النوع المحدد عبارة عن سلسلة أم لا:

type IsString = T extends string ? "String" : "Not a string";

type Result1 = IsString;  // Result1 is "String"
type Result2 = IsString;  // Result2 is "Not a string"

في هذا المثال، يتحقق IsString مما إذا كان T يمتد إلى string. إذا كان الأمر كذلك، فستكون النتيجة "String"؛ وإلا، فستكون "Not a string".

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

يمكن أيضًا استخدام الأنواع الشرطية مع الأنواع العامة لإنشاء تعريفات أنواع أكثر مرونة وقابلية لإعادة الاستخدام. على سبيل المثال، نوع يستخرج نوع الإرجاع لدالة:

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

type FunctionType = (x: number) => string;

type Result = ReturnType;  // Result is string

في هذا المثال، يستخدم ReturnType الكلمة الأساسية infer لاستنتاج نوع الإرجاع R لنوع الدالة T. إذا كان T نوع دالة، فسيكون ReturnType هو نوع الإرجاع؛ وإلا، فسيكون افتراضيًا never.

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

يمكن أيضًا للأنواع الشرطية العمل مع أنواع الاتحاد للتعامل مع أنواع متعددة محتملة. على سبيل المثال، التمييز بين أعضاء الاتحاد المختلفة:

type ExtractString = T extends string ? T : never;

type UnionType = string | number | boolean;

type Result = ExtractString;  // Result is string

في هذا المثال، يقوم ExtractString باستخراج string من نوع الاتحاد UnionType، مما يؤدي إلى string.

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

يمكن دمج الأنواع الشرطية مع تعيينات الأنواع لإنشاء تحويلات أنواع أكثر تعقيدًا. على سبيل المثال، تعيين مجموعة من الأنواع لتطبيق نوع شرطي:

type MapArray = {
  [K in keyof T]: T[K] extends string ? T[K] : never;
};

type ArrayType = [string, number, boolean];

type MappedArray = MapArray;  // MappedArray is [string, never, never]

في هذا المثال، تقوم MapArray بتعيين كل عنصر من عناصر المصفوفة T وتطبق نوعًا شرطيًا على كل عنصر، مما يؤدي إلى إنشاء مصفوفة يتم فيها الاحتفاظ بعناصر السلسلة فقط.

خاتمة

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