تواقيع الفهرسة للكائنات
جزء من قسم مقدمة إلى TypeScript في رحلة JavaScript على Coddy. الدرس 72 من 73.
في بعض الأحيان، قد تحتاج إلى العمل مع كائنات (objects) حيث تعرف نوع القيم التي ستحتوي عليها، ولكنك لا تعرف أسماء الخصائص المحددة مسبقاً. هذا أمر شائع عند العمل مع القواميس (dictionaries) أو الخرائط (maps) أو كائنات التكوين (configuration objects) حيث تكون المفاتيح (keys) ديناميكية.
تسمح لك تواقيع الفهرسة (Index signatures) بتعريف بنية النوع لمثل هذه الكائنات. تستخدم الصيغة الأقواس المربعة لتحديد نوع المفتاح ونوع القيمة:
interface StringDictionary {
[key: string]: number;
}تنص هذه الواجهة على أن "أي مفتاح من نوع string سيكون له قيمة من نوع number". يمكنك بعد ذلك إنشاء كائنات تطابق هذا النمط:
let scores: StringDictionary = {
"alice": 95,
"bob": 87,
"charlie": 92
};تعد تواقيع الفهرس (Index signatures) مفيدة بشكل خاص لسيناريوهات مثل تخزين تفضيلات المستخدم، أو التخزين المؤقت للبيانات بمفاتيح ديناميكية، أو العمل مع استجابات واجهة برمجة التطبيقات (API) حيث لا تكون أسماء الخصائص معروفة في وقت التجميع (compile time). عادةً ما يكون نوع المفتاح هو string أو number، بينما يمكن أن يكون نوع القيمة أي نوع TypeScript صالح.
التحدي
سهلقم بإنشاء واجهة (interface) لنظام كتالوج المنتجات حيث يتم تخزين فئات المنتجات وكميات مخزونها بشكل ديناميكي.
أنشئ واجهة تسمى ProductCatalog تستخدم توقيع الفهرس (index signature) لربط مفاتيح من نوع string (أسماء المنتجات) بقيم من نوع number (كميات المخزون).
أنشئ دالة تسمى getStockLevel تقوم بما يلي:
- تأخذ معاملين:
catalogمن نوعProductCatalogوproductNameمن نوعstring - تعيد كمية المخزون لاسم المنتج المحدد
- تعيد
0إذا كان المنتج غير موجود في الكتالوج - لها نوع إرجاع صريح هو
number
أنشئ دالة تسمى updateStock تقوم بما يلي:
- تأخذ ثلاثة معاملات:
catalogمن نوعProductCatalog، وproductNameمن نوعstring، وnewQuantityمن نوعnumber - تحدث كمية المخزون للمنتج المحدد
- تعيد
void
أنشئ دالة تسمى getTotalStock تقوم بما يلي:
- تأخذ معاملاً
catalogمن نوعProductCatalog - تعيد مجموع كل كميات المخزون في الكتالوج
- لها نوع إرجاع صريح هو
number
أنشئ بيانات اختبار:
- أنشئ
inventoryمن نوعProductCatalogمع المنتجات التالية:"laptop":15"mouse":50"keyboard":25"monitor":8
اختبر دوالك واطبع المخرجات التالية:
- استدعِ
getStockLevelمعinventoryو"laptop" - استدعِ
getStockLevelمعinventoryو"tablet" - استدعِ
getTotalStockمعinventory - استدعِ
updateStockمعinventoryو"mouse"و75 - استدعِ
updateStockمعinventoryو"webcam"و12 - استدعِ
getStockLevelمعinventoryو"mouse" - استدعِ
getStockLevelمعinventoryو"webcam" - استدعِ
getTotalStockمعinventory
جرّب بنفسك
// TODO: اكتب كودك هنا
// أنشئ واجهة ProductCatalog
// أنشئ دالة getStockLevel
// أنشئ دالة updateStock
// أنشئ دالة getTotalStock
// أنشئ بيانات تجريبية - كائن inventory
// اختبر الدوال واطبع النتائج
console.log(getStockLevel(inventory, "laptop"));
console.log(getStockLevel(inventory, "tablet"));
console.log(getTotalStock(inventory));
updateStock(inventory, "mouse", 75);
updateStock(inventory, "webcam", 12);
console.log(getStockLevel(inventory, "mouse"));
console.log(getStockLevel(inventory, "webcam"));
console.log(getTotalStock(inventory));يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس مقدمة إلى 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 عبر الإنترنت