كيفية استخدام تأكيدات النوع في TypeScript

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

ما هو تأكيد النوع؟

Type assertion هي آلية في TypeScript تسمح لك بتجاوز استنتاج النوع الافتراضي الذي يقوم به مُجمِّع TypeScript. لا يغير هذا النوع الفعلي وقت التشغيل ولكنه يساعد المُجمِّع على فهم نوع المتغير من أجل التحقق من النوع. إن تأكيدات النوع تشبه تحويل النوع في لغات أخرى مثل C# أو Java، ولكن بدون أي تأثير وقت التشغيل.

بناء جملة تأكيدات النوع

هناك طريقتان لاستخدام تأكيدات النوع في TypeScript:

  • استخدام الكلمة الرئيسية as (موصى به)
  • استخدام أقواس الزاوية <>

استخدام الكلمة الأساسية as

الطريقة الأكثر شيوعًا لاستخدام تأكيدات النوع هي باستخدام الكلمة الأساسية as:

let someValue: unknown = "Hello, TypeScript!";
let strLength: number = (someValue as string).length;

console.log(strLength); // Output: 17

في هذا المثال، نخبر TypeScript أن someValue من نوع string، مما يسمح لنا باستخدام الخاصية length.

استخدام أقواس الزاوية <>

يستخدم بناء الجملة البديل لتأكيدات النوع أقواس الزاوية:

let someValue: unknown = "Hello, TypeScript!";
let strLength: number = (someValue).length;

console.log(strLength); // Output: 17

يحقق هذا النحو نفس النتيجة التي يحققها نحو as. ومع ذلك، لا يُنصح باستخدامه في البيئات التي تستخدم JSX (مثل React)، لأنه يتعارض مع نحو عناصر JSX.

حالات الاستخدام الشائعة لتأكيدات النوع

تُستخدم تأكيدات النوع عادةً في العديد من السيناريوهات:

  • عند العمل مع النوع unknown
  • عند التعامل مع عناصر DOM
  • عند تضييق نطاق أنواع الاتحاد
  • عند التفاعل مع مكتبات الطرف الثالث التي تفتقر إلى تعريفات النوع

مثال: تأكيد الأنواع باستخدام النوع unknown

يُعد النوع unknown مفيدًا عندما تريد قبول أي نوع ولكنك لا تزال بحاجة إلى إجراء بعض عمليات التحقق من النوع قبل استخدامه. تساعد تأكيدات النوع في تضييق نطاق النوع:

function getLength(value: unknown): number {
  if (typeof value === "string") {
    return (value as string).length;
  } else if (Array.isArray(value)) {
    return (value as any[]).length;
  }
  return 0;
}

console.log(getLength("Hello")); // Output: 5
console.log(getLength([1, 2, 3])); // Output: 3
console.log(getLength(42)); // Output: 0

في هذا المثال، نستخدم تأكيدات النوع لإخبار TypeScript أن value عبارة عن string أو مصفوفة any[].

مثال: التعامل مع عناصر DOM

عند التعامل مع DOM، يحتاج TypeScript إلى معرفة النوع المحدد لعنصر ما لتوفير الخصائص والطرق المناسبة. تعد تأكيدات النوع مفيدة هنا:

const inputElement = document.getElementById("user-input") as HTMLInputElement;
inputElement.value = "Hello, TypeScript!";

هنا، نستخدم تأكيد النوع لإخبار TypeScript أن inputElement هو HTMLInputElement، مما يسمح لنا بالوصول إلى خاصية value مباشرة.

تأكيد النوع مقابل صب النوع

من الضروري فهم الفرق بين تأكيد النوع وتحويل النوع. في TypeScript، لا تغير تأكيدات النوع النوع الفعلي وقت التشغيل؛ فهي تخبر مُجمِّع TypeScript فقط بكيفية التعامل مع النوع وقت التجميع. على النقيض من ذلك، قد يتضمن تحويل النوع في لغات أخرى مثل C# أو Java تحويل قيمة من نوع إلى آخر وقت التشغيل، مما قد يؤثر على الأداء والسلوك.

تحذيرات عند استخدام تأكيدات النوع

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

  • تجنب استخدام التأكيدات لتحويل الأنواع غير المتوافقة قسراً.
  • استخدم دائمًا التأكيدات بحذر ويفضل تضييق الأنواع باستخدام حراس أنواع TypeScript.
  • استخدم التأكيدات عندما تكون متأكدًا من النوع وعندما لا يكون من الممكن تضييقه بطريقة أخرى.

مثال على تأكيد النوع غير الصحيح

فيما يلي مثال على تأكيد النوع الخطير:

let someValue: string = "Hello, TypeScript!";
let numValue: number = (someValue as unknown as number); // Dangerous!

console.log(numValue); // Output: Hello, TypeScript! (incorrect)

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

خاتمة

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

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