TypeScript / الأساسي / الدرس 6
المصفوفات والصفوف والفهرسة المفحوصة
نمذج التسلسلات والسجلات الموضعية وافحص غياب العناصر وميّز readonly من نسخ التنفيذ المستقلة.
في هذه الصفحة
أهداف الدرس
- استخدام المصفوفات وreadonly والصفوف للبنى المناسبة.
- معالجة الفهرسة المحتملة لـundefined.
- شرح النسخ السطحي واجتياز التسلسل الآمن.
اختيار الطول المتغير أو المواضع الثابتة
تصف number[] طولًا متغيرًا ويعطي [number, number] معلومات موضعية محددة. يبقى الصف مصفوفة JavaScript ولا يفحص التعليق طول بيانات خارجية. استخدم كائنًا مسمى إذا وضحت به الحقول. تمنع readonly التعديل عبر العرض لا التخصيص المشترك أو كل الأسماء. اختر النموذج وفق العملية وصحة الفراغ ومعنى المواضع.
لا يضمن نوع العنصر وجوده
يفعّل المقرر noUncheckedIndexedAccess فتشمل الفهرسة غير المؤكدة undefined. لا يثبت فحص الطول دائمًا صلاحية فهرس معين للفاحص؛ افحص القيمة أو اجتز العناصر الموجودة. تعلن الدالة احتمال الغياب ويختار المستدعي بديله عبر ?? مع حفظ الصفر. لا تضف تأكيد عدم الغياب لأن اختبارًا غير فارغ. إذا كان عدم الفراغ شرطًا فمثّله وافحصه عند الإنشاء.
export {};
function first(values: readonly number[]): number | undefined { return values[0]; }
console.log(first([3, 5]) ?? "missing", first([]) ?? "missing");
3 missing
يوجد عنصر صفر في الأولى وتعطي الفارغة undefined فيعمل البديل الصريح.
استخدام مواضع ثابتة بعقد واضح
يقبل المثال زوج إحداثيات readonly ويفك موضعيه المعروفين. يعرف الفاحص وجودهما في الاستدعاء المفحوص بخلاف الفهرسة العامة. يحسب مربع المسافة لقيم صغيرة دون فرض النهاية العددية أو الوحدات. تفادى scalar كشف تعديل داخلي. افحص مصفوفة JSON بعنصرين عدديين قبل العرض؛ فتحويلها إلى Point ثقة ساكنة لا فحص طول أو قيم.
export {};
type Point = readonly [number, number];
function squaredDistance([x, y]: Point): number { return x * x + y * y; }
const point: Point = [3, 4];
console.log(squaredDistance(point));
25
يعطي الإحداثيان تسعة وستة عشر ومجموعهما خمسة وعشرون دون تعديل العرض.
إظهار التعديل والنسخ
تزور for...of القيم وتناسب غياب الحاجة للموضع. تنشئ map مصفوفة وتعدل sort المستقبل ما لم تنسخه أو تستخدم بديلًا ثابتًا مدعومًا. انتشار المصفوفة سطحي وتبقى الكائنات مشتركة. تسمح const بـpush عبر نوع قابل للتعديل. ميّز readonly من لقطة مستقلة للعمل المنتظر؛ فلا تحفظ المعلمة حالة سابقة إذا عدل مالك آخر البيانات.
اختبار البنية وحدود الموارد
تحتاج المصفوفة الخارجية فحص عناصر وبنية وحجم عملي. قد تضم number قيم NaN أو لانهاية وقد تستنفد مصفوفة صحيحة الموارد. تضيف المصفوفة المتناثرة سببًا لعدم افتراض الوجود. وللنص وحدات UTF-16 عند الفهرسة. اختبر الفراغ والمفقود والتكرار والتشارك والحد الأقصى. تحسن readonly والصفوف التفكير المحلي، ويثبت الفحص التنفيذي مطابقة البيانات الخارجية؛ فوثّق المسؤوليتين.
الأخطاء الشائعة وإصلاحها
عنصر مفهرس قد يكون undefined.
- لماذا يحدث؟
- نوع العنصر لا يضمن وجود الموضع.
- كيف تصلحه؟
- عالج الغياب أو افحص بنية أقوى.
- كيف تتجنب تكراره؟
- أبقِ فحص الفهرسة مفعّلًا.
الفرز يغير مصفوفة المستدعي.
- لماذا يحدث؟
- فرز التنفيذ المستقبل المشترك.
- كيف تصلحه؟
- انسخ عمدًا قبل التعديل عند حاجة لقطة.
- كيف تتجنب تكراره؟
- اذكر التعديل في عقد الدالة.
مصفوفة منسوخة تشارك الكائنات الداخلية.
- لماذا يحدث؟
- أنشأ الانتشار نسخة سطحية.
- كيف تصلحه؟
- اختر تمثيلًا مستقلًا يناسب المجال.
- كيف تتجنب تكراره؟
- اختبر التشارك الداخلي لا المساواة الخارجية فقط.
اختبر فهمك
1. استدع first مع [0] واشرح حفظ الصفر وتغير النتيجة مع ||.
اعرض الحل المشروح
تعيد first صفرًا ويحفظه ?? لأنه ليس null أو undefined. يستبدله || بـmissing لكونه غير صادق. الفرق قرار مجال لا تحسين مترجم. اختبر الصفر منفصلًا عن المصفوفة الفارغة.
2. تُتوقع قيمة JSON unknown كـPoint. حدّد الفحوص والسياسة اللازمة بعد أنواع العناصر.
اعرض الحل المشروح
افحص أنها مصفوفة بطول اثنين وعنصرين عدديين ثم النهاية والحدود والوحدات المناسبة. بعد ذلك ابنِ زوجًا مفحوصًا. لا تفحص معلمة الصف الإدخال أو الموارد أو وحدات الموقع والهندسة.
أهم ما تعلمته
- مثّل غياب العناصر بصدق.
- تختلف readonly عن النسخ المستقل.
- افحص البنية الخارجية قبل الثقة بمواضع الصف.