حراس النوع في TypeScript

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

ما هي حراس النوع؟

حراس النوع عبارة عن تعبيرات تقوم بإجراء عمليات فحص وقت التشغيل وتسمح لـ TypeScript باستنتاج نوع أكثر تحديدًا لمتغير. وهي تساعد في التمييز بين الأنواع المختلفة، وخاصة عند التعامل مع أنواع الاتحاد. يمكن تنفيذ حراس النوع باستخدام تقنيات مختلفة، بما في ذلك:

  • تنبؤات النوع المحددة من قبل المستخدم
  • تأكيدات النوع
  • فحص الحالات
  • استخدام عامل typeof
  • استخدام عامل in

تنبؤات النوع المحددة من قبل المستخدم

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

function isString(value: any): value is string {
  return typeof value === 'string';
}

function printString(value: any) {
  if (isString(value)) {
    console.log(value.toUpperCase()); // TypeScript knows value is a string here
  } else {
    console.log('Not a string');
  }
}

في المثال أعلاه، isString هو مسند نوع محدد من قبل المستخدم يساعد TypeScript على فهم أن value عبارة عن سلسلة داخل كتلة if.

تأكيدات النوع

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

function printLength(value: any) {
  console.log((value as string).length); // Assert value is a string
}

في هذا المثال، تخبر value as string TypeScript بالافتراض أن value عبارة عن سلسلة دون إجراء فحص وقت التشغيل.

فحص الحالات

تُستخدم عمليات التحقق من الحالات لتحديد ما إذا كان الكائن عبارة عن حالة لفئة معينة. وهذا مفيد لتضييق نطاق الأنواع عند العمل مع الفئات:

class Dog {
  bark() { console.log('Woof'); }
}

class Cat {
  meow() { console.log('Meow'); }
}

function speak(animal: Dog | Cat) {
  if (animal instanceof Dog) {
    animal.bark(); // TypeScript knows animal is a Dog here
  } else {
    animal.meow(); // TypeScript knows animal is a Cat here
  }
}

في هذا المثال، يساعد عامل instanceof TypeScript في استنتاج نوع animal استنادًا إلى فئته.

استخدام عامل typeof

يمكن استخدام عامل typeof للتحقق من الأنواع البدائية مثل string، وnumber، وboolean:

function processValue(value: string | number) {
  if (typeof value === 'string') {
    console.log(value.toUpperCase()); // TypeScript knows value is a string here
  } else {
    console.log(value.toFixed(2)); // TypeScript knows value is a number here
  }
}

هنا، يتم استخدام typeof للتحقق مما إذا كانت value عبارة عن string أو number ويضيق النوع وفقًا لذلك.

استخدام عامل in

يتحقق عامل in من وجود خاصية في الكائن. وهذا مفيد للتمييز بين الأنواع التي تشترك في خصائص مشتركة:

interface Bird {
  fly: () => void;
}

interface Fish {
  swim: () => void;
}

function move(creature: Bird | Fish) {
  if ('fly' in creature) {
    creature.fly(); // TypeScript knows creature is a Bird here
  } else {
    creature.swim(); // TypeScript knows creature is a Fish here
  }
}

في هذا المثال، يساعد عامل التشغيل in TypeScript في تحديد ما إذا كان creature هو Bird أو Fish استنادًا إلى وجود طريقة.

خاتمة

تُعد حراسات النوع في TypeScript أدوات أساسية للعمل مع الأنواع بطريقة مرنة وآمنة. فهي تسمح بفحص النوع بدقة أكبر ويمكنها منع أخطاء وقت التشغيل من خلال ضمان استخدام النوع الصحيح في سيناريوهات مختلفة. إن فهم حراسة النوع واستخدامها بشكل فعال يمكن أن يؤدي إلى إنشاء كود TypeScript أكثر قوة وقابلية للصيانة.