تأكيدات النوع
جزء من قسم مقدمة إلى TypeScript في رحلة JavaScript على Coddy. الدرس 68 من 73.
أحيانًا لا تتوفر لدى TypeScript معلومات كافية لتحديد النوع الدقيق لقيمة ما، لكنك بصفتك المطوّر تعرف أكثر عن ماهية تلك القيمة فعليًا. تتيح لك تأكيدات الأنواع أن تقول لـ TypeScript: "ثق بي، فأنا أعرف أن هذه القيمة من هذا النوع المحدد."
يوفّر TypeScript صياغتين لتأكيد الأنواع. صياغة as هي الطريقة الأكثر شيوعًا:
let data: unknown = '{"name": "John", "age": 30}';
let user = data as string;يمكنك أيضًا استخدام صياغة الأقواس الزاوية، رغم أنها أقل شيوعًا في TypeScript الحديثة:
let data: unknown = '{"name": "John", "age": 30}';
let user = <string>data;ينطبق الأمر نفسه على الكائنات. عندما تصل قيمة على هيئة unknown، يمكنك تأكيد البنية التي تتوقعها، ثم قراءة خصائصها:
let payload: unknown = { name: "John", age: 30 };
let user = payload as { name: string; age: number };
console.log(user.name);لا يغيّر التأكيد إلا ما يعتقده TypeScript بشأن القيمة. فهو لا يحوّل أي شيء أثناء وقت التشغيل، لذا أكّد شكلًا ما فقط عندما تعلم أن القيمة تمتلكه فعلًا.
التحدي
سهلأنشئ دالة تعالج البيانات من محاكاة لواجهة API خارجية. ستعمل مع قيم من النوع unknown وستستخدم تأكيدات الأنواع للوصول إلى خصائصها بأمان.
أنشئ متغيرًا باسم apiResponse من النوع unknown وأسند إليه سلسلة JSON التالية:
{"userId": 42, "username": "alice_dev", "isActive": true}أنشئ دالة باسم processUserData تقوم بما يلي:
- تأخذ معلمة باسم
dataمن النوعunknown - تستخدم تأكيد نوع للتعامل مع
dataعلى أنهاstring - تحلل سلسلة JSON باستخدام
JSON.parse() - تستخدم تأكيد نوع آخر للتعامل مع النتيجة المحللة على أنها كائن له الخصائص
userId(number) وusername(string) وisActive(boolean) - تعيد سلسلة منسقة:
"User [userId]: [username] (Active: [isActive])" - لها نوع إرجاع صريح هو
string
أنشئ بيانات اختبار إضافية:
- أنشئ
secondApiResponseمن النوعunknownباستخدام سلسلة JSON التالية:{"userId": 15, "username": "bob_admin", "isActive": false} - أنشئ
thirdApiResponseمن النوعunknownباستخدام سلسلة JSON التالية:{"userId": 99, "username": "charlie_user", "isActive": true}
اختبر الدالة واطبع المخرجات التالية:
- استدعِ
processUserDataمعapiResponseواطبع النتيجة - استدعِ
processUserDataمعsecondApiResponseواطبع النتيجة - استدعِ
processUserDataمعthirdApiResponseواطبع النتيجة
جرّب بنفسك
// أنشئ متغيرات استجابة API
const apiResponse: unknown = '{"userId": 42, "username": "alice_dev", "isActive": true}';
const secondApiResponse: unknown = '{"userId": 15, "username": "bob_admin", "isActive": false}';
const thirdApiResponse: unknown = '{"userId": 99, "username": "charlie_user", "isActive": true}';
// TODO: أنشئ الدالة processUserData هنا
// اختبر الدالة واطبع النتائج
console.log(processUserData(apiResponse));
console.log(processUserData(secondApiResponse));
console.log(processUserData(thirdApiResponse));يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس مقدمة إلى TypeScript
1البداية مع TS
ما هي TypeScript؟لماذا نستخدم TypeScript؟أول كود TypeScript لكعملية الـ Compilation والأخطاءملخص: مقدمة في TS4التعامل مع الدوال
تحديد أنواع المعاملات وقيم الإرجاعتحديد أنواع Arrow Functionsنوع الإرجاع 'void'المعاملات الاختيارية باستخدام '?'القيم الافتراضية للمعاملاتتحديد أنواع Rest Parametersتعريف أنواع الدوالملخص: بناء دوال محددة الأنواع2الأنواع الأساسية
الأنواع الأساسية: str وnum وbooleanالنوع 'any': منفذ للهروبالنوع 'unknown'العمل مع null وundefinedاستدلال الأنواع عمليًاتعليقات الأنواع الصريحةمراجعة وتطبيق: الأنواع الأساسية5الأنواع: الأسماء المستعارة، الاتحادات والتقاطعات
الأسماء المستعارة للأنواع الأساسية (Primitives)أنواع الاتحاد ('|')التعامل مع أنواع الاتحادالأنواع الحرفية (Literal Types)أنواع التقاطع ('&')دمج الأسماء المستعارة للأنواعملخص: تركيبات الأنواع المتقدمة3هياكل البيانات: المصفوفات و Tuple
المصفوفات محددة النوع (Typed Arrays)معدل 'readonly' للمصفوفاتما هو الـ Tuple؟تعريف والوصول إلى الـ Tuplesتفكيك الـ Tuples (Destructuring)الـ Tuples للقراءة فقط (Readonly)المصفوفات محددة النوع متعددة الأبعاداستخدام Spread Operator مع المصفوفاتملخص: المصفوفات و Tuples6تحديد أنواع الكائنات والواجهات
توصيف أنواع الكائنات المضمنة (Inline)الأسماء المستعارة للأنواع (Type Aliases) للكائناتمقدمة عن الواجهات (Interfaces)الواجهات (Interfaces) مقابل الأسماء المستعارة للأنواع (Type Aliases)الخصائص الاختيارية وخصائص القراءة فقط (Readonly)توسيع الواجهات والأنواعإضافة الدوال (Methods) إلى الواجهاتملخص: تحديد هياكل الكائناتتدرّب بنفسك: Playground لـ TypeScript