حراس النوع: in و instanceof
جزء من قسم Introduction To TypeScript في رحلة JavaScript على Coddy. الدرس 69 من 73.
عند العمل مع أنواع الاتحاد (union types)، غالباً ما تحتاج إلى تحديد النوع المحدد الذي تتعامل معه قبل أن تتمكن من الوصول بأمان إلى الخصائص أو الأساليب الخاصة بالنوع. توفر حراس النوع (Type guards) طريقة آمنة لتضييق نطاق الأنواع في وقت التشغيل (runtime).
يتحقق عامل التشغيل in مما إذا كانت الخاصية موجودة في كائن ما. هذا مفيد بشكل خاص عندما يكون لديك اتحاد (union) لأنواع الكائنات بخصائص مختلفة:
type Dog = { name: string; breed: string };
type Cat = { name: string; meow: () => void };
function petSound(pet: Dog | Cat) {
if ('breed' in pet) {
// TypeScript يعرف أن pet هو Dog هنا
console.log(`${pet.name} is a ${pet.breed}`);
} else {
// TypeScript يعرف أن pet هو Cat هنا
pet.meow();
}
}يتحقق عامل instanceof مما إذا كان الكائن قد تم إنشاؤه بواسطة دالة منشئ (constructor function) أو فئة (class) معينة. على الرغم من أننا لم نغطِ الفئات بعد، إلا أن هذا العامل مفيد عند التعامل مع كائنات JavaScript المدمجة أو الفئات المخصصة:
function processValue(value: string | Date) {
if (value instanceof Date) {
// TypeScript يعرف أن value هو Date
console.log(value.getFullYear());
} else {
// TypeScript يعرف أن value هو string
console.log(value.toUpperCase());
}
}يساعد كلا العاملين مترجم TypeScript على فهم النوع الذي تعمل معه، مما يتيح الوصول الآمن إلى الخصائص والأساليب الخاصة بالنوع.
التحدي
سهلقم بإنشاء دالة تعالج أنواعاً مختلفة من عناصر الوسائط باستخدام عامل التشغيل in للتمييز بينها.
قم بإنشاء اسمين مستعارين للأنواع (type aliases):
Movieمع الخصائصtitle(string) وdirector(string)Songمع الخصائصtitle(string) وartist(string)
قم بإنشاء دالة باسم getMediaInfo تقوم بما يلي:
- تأخذ معامل
mediaمن نوعMovie | Song - تستخدم عامل التشغيل
inللتحقق مما إذا كانت خاصيةdirectorموجودة - تعيد
"Movie: [title] directed by [director]"إذا كان فيلماً - تعيد
"Song: [title] by [artist]"إذا كانت أغنية - لها نوع إرجاع صريح هو
string
قم بإنشاء دالة ثانية باسم processValue تقوم بما يلي:
- تأخذ معامل
valueمن نوعstring | Date - تستخدم عامل التشغيل
instanceofللتحقق مما إذا كانvalueمن نوعDate - تعيد السنة كرقم إذا كان التاريخ (باستخدام
getFullYear()) - تعيد طول السلسلة النصية كرقم إذا كانت سلسلة نصية
- لها نوع إرجاع صريح هو
number
قم بإنشاء بيانات اختبار:
movie1:{ title: "Inception", director: "Christopher Nolan" }song1:{ title: "Bohemian Rhapsody", artist: "Queen" }movie2:{ title: "The Matrix", director: "The Wachowskis" }song2:{ title: "Imagine", artist: "John Lennon" }testDate:new Date("2023-12-25")testString:"TypeScript"
اطبع المخرجات التالية:
- استدعاء
getMediaInfoمعmovie1 - استدعاء
getMediaInfoمعsong1 - استدعاء
getMediaInfoمعmovie2 - استدعاء
getMediaInfoمعsong2 - استدعاء
processValueمعtestDate - استدعاء
processValueمعtestString
جرّب بنفسك
// TODO: اكتب كودك هنا
// إنشاء أسماء مستعارة للأنواع (type aliases) لكل من Movie و Song
// إنشاء دالة getMediaInfo
// إنشاء دالة processValue
// إنشاء بيانات اختبار
const movie1 = { title: "Inception", director: "Christopher Nolan" };
const song1 = { title: "Bohemian Rhapsody", artist: "Queen" };
const movie2 = { title: "The Matrix", director: "The Wachowskis" };
const song2 = { title: "Imagine", artist: "John Lennon" };
const testDate = new Date("2023-12-25");
const testString = "TypeScript";
// طباعة المخرجات
console.log(getMediaInfo(movie1));
console.log(getMediaInfo(song1));
console.log(getMediaInfo(movie2));
console.log(getMediaInfo(song2));
console.log(processValue(testDate));
console.log(processValue(testString));يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Introduction To TypeScript
1البداية مع TS
ما هي TypeScript؟لماذا نستخدم TypeScript؟أول كود TypeScript لكعملية الـ Compilation والأخطاءملخص: مقدمة في TS4التعامل مع الدوال
تحديد أنواع المعاملات وقيم الإرجاعتحديد أنواع Arrow Functionsنوع الإرجاع 'void'المعاملات الاختيارية باستخدام '?'القيم الافتراضية للمعاملاتتحديد أنواع Rest Parametersتعريف أنواع الدوالملخص: بناء دوال محددة الأنواع2الأنواع الأساسية
الأنواع الأساسية: str, num, booleanالنوع 'any': مخرج الهروبالنوع 'unknown'التعامل مع 'null' و 'undef'استنتاج الأنواع في التطبيق العمليتوضيحات الأنواع الصريحةمراجعة: تدريب على الأنواع الأساسية5الأنواع: الأسماء المستعارة، الاتحادات والتقاطعات
الأسماء المستعارة للأنواع الأساسية (Primitives)أنواع الاتحاد ('|')التعامل مع أنواع الاتحادالأنواع الحرفية (Literal Types)أنواع التقاطع ('&')دمج الأسماء المستعارة للأنواعملخص: تركيبات الأنواع المتقدمة8Enums
ما هو الـ Numeric Enum؟استخدام الـ Numeric Enumsما هو الـ String Enum؟استخدام الـ String Enumsالـ Heterogeneous Enumsملخص: استخدام الـ Enums11مواضيع متقدمة
تأكيدات النوعحراس النوع: in و instanceofالنوع 'never'الأنواع القابلة للقيمة Null ('strictNull')تواقيع الفهرسة للكائناتملخص: ضبط الأنواع بدقة3هياكل البيانات: المصفوفات و Tuple
المصفوفات محددة النوع (Typed Arrays)معدل 'readonly' للمصفوفاتما هو الـ Tuple؟تعريف والوصول إلى الـ Tuplesتفكيك الـ Tuples (Destructuring)الـ Tuples للقراءة فقط (Readonly)المصفوفات محددة النوع متعددة الأبعاداستخدام Spread Operator مع المصفوفاتملخص: المصفوفات و Tuples6تحديد أنواع الكائنات والواجهات
توصيف أنواع الكائنات المضمنة (Inline)الأسماء المستعارة للأنواع (Type Aliases) للكائناتمقدمة عن الواجهات (Interfaces)الواجهات (Interfaces) مقابل الأسماء المستعارة للأنواع (Type Aliases)الخصائص الاختيارية وخصائص القراءة فقط (Readonly)توسيع الواجهات والأنواعإضافة الدوال (Methods) إلى الواجهاتملخص: تحديد هياكل الكائناتتدرّب بنفسك: مترجم JavaScript عبر الإنترنت