محتويات الدورة

TypeScript / المتوسط / الدرس 7

الأنواع العامة وعلاقات المفاتيح

احفظ علاقات الاستدعاءات بدل استبدالها بـany وقيّد العمليات العامة بالقدرات اللازمة فعلًا.

وقت القراءة التقريبي: 3 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • شرح معاملات الأنواع والاستنتاج والقيود.
  • ربط المفاتيح بأنواع قيم خصائصها.
  • تجنب تواقيع عامة تعد بإنشاء تنفيذي لا تقدر عليه.

يربط معامل النوع استعمالات النوع نفسه

تعبّر الدالة العامة عن علاقة مدخل ومخرج دون نوع محدد، لا مجرد موضع يظهر مرة. تفقد any العلاقة وتسمح بعمليات غير مفحوصة ونتائج غير مترابطة. تحمي unknown الحد الخارجي بطلب الدليل ولا تحفظ وحدها علاقة نتيجة خاصة بالمستدعي. اختر معامل نوع لعملية تعمل لعدة أنواع بعقد واحد. تُمحى المعاملات ولا تنشئ منشئات أو مخططات تنفيذية.

ربط المفتاح المقبول بنتيجته الدقيقة

تنتج keyof اتحاد المفاتيح المعروفة ويصف T[K] قيمة المفتاح. يقيد المثال K بمفاتيح T فيمنع تهجئة غير مرتبطة للمستدعي المفحوص. تبقى id عددًا وlabel نصًا. ينفذ فهرسة JavaScript ولا يفحص كائنًا خارجيًا أو ينشئ حقلًا مفقودًا. قد تعطي الاختيارية undefined وتختلف تواقيع الفهرسة العامة عن كائن محدود. راجع T المستنتجة عند الاستدعاء.

typescript المفتاح يضبط نوع الخاصية المعادة
export {};
function get<T, K extends keyof T>(object: T, key: K): T[K] { return object[key]; }
const item = { id: 7, label: "map" };
console.log(get(item, "id"), get(item, "label"));
الناتج المتوقع
7 map

يختار المفتاحان حقليهما الموجودين ويحفظ المساعد نوع كل خاصية بدل any.

ترك الرد يحدد نوع عنصر الناتج

تستخدم الدالة معاملَي إدخال وإخراج لأن التحويل يغير النوع. يستنتجان من المصفوفة والرد دون وسائط نوع صريحة. توضح readonly عدم الحاجة لتعديل العرض ويعيد map مصفوفة جديدة. لا يلزم قيد كائن أو استنساخ لأنها لا تفحص الأعضاء. قد ترفض القيود الزائدة مستدعين صالحين وتعقد الاستنتاج دون زيادة الأمان.

typescript استنتاج علاقة تحويل العناصر
export {};
function convert<T, U>(values: readonly T[], operation: (value: T) => U): U[] {
  return values.map(operation);
}
const labels = convert([1, 2], value => `n${value}`);
console.log(JSON.stringify(labels));
الناتج المتوقع
["n1","n2"]

تكون T عددًا وU نصًا ويحوي الناتج نصوصًا بترتيب المصدر.

القيد قدرة دنيا لا قيمة محددة

يسمح T extends { length: number } بقراءة الطول ولا يسمح بإعادة أي كائن له طول كـT. قد يضيف المستدعي خصائص أو قيودًا حرفية أو صنفًا أدق. يحتاج إنشاء T مصنعًا أو قيمة إدخال أو علاقة مبررة. لا تؤكد كائنًا إلى T لإخفاء العيب؛ أعد البنية الفعلية أو اطلب رد إنشاء. وظيفة العموم إظهار العلاقة لا إخفاء الافتراض.

اختبار الاستنتاج من منظور المستهلك

ينبغي أن تستنتج الواجهة الاستدعاءات المعتادة وتوضح الخطأ قربها. اختبر الفراغ والحرفية والمفاتيح الاختيارية وreadonly ونتائج ردود مختلفة. تفيد وسائط النوع لاختيار مقصود لا للتحايل على توقيع معقد. لا يفحص العموم JSON.parse أو المجال أو الصلاحيات. افحص المفتاح الخارجي وسياسة الوصول قبل مساعد يفترض صحة المدخلات.

الأخطاء الشائعة وإصلاحها

مساعد عام يعيد any ويفقد دقة الخاصية.

لماذا يحدث؟
انفصلت النتيجة عن مفتاح الإدخال.
كيف تصلحه؟
عبّر عن K extends keyof T وT[K] عند الملاءمة.
كيف تتجنب تكراره؟
راجع العلاقات بدل إضافة المعاملات آليًا.

تعذر إعادة T مصطنعة رغم القيد.

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

قيود إضافية ترفض مصفوفات مفيدة.

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

اختبر فهمك

1. أضف description?: string للنموذج. ما ناتج get لهذا المفتاح وكيف ينسق الغياب؟

اعرض الحل المشروح

يشمل الإرجاع string | undefined لاحتمال الغياب. استخدم ?? ببديل موثق أو تفرع undefined. تحفظ العلاقة عدم اليقين ولا تحول الاختياري إلى مضمون. افحص الخارج قبل إنشاء النموذج.

2. استخدم convert لتحويل [2, 4] إلى كائنات doubled وحدّد النوع وJSON.

اعرض الحل المشروح

أعد { doubled: value * 2 }. تُستنتج U ككائن بخاصية عددية ويكون JSON [{"doubled":4},{"doubled":8}]. لا يلزم تأكيد أو U صريحة لأن الرد يقدم دليلًا، وتظل للحساب شروط مجال.

أهم ما تعلمته

  • استخدم العموم لحفظ العلاقات الفعلية.
  • يتيح القيد عمليات لا إنشاءً اعتباطيًا.
  • اختبر الاستنتاج والحدود الخارجية منفصلين.

المراجع الرسمية