Sanyanggae LogoSanyanggae

📱 تطوير الجوال والتطبيقات

أنواع TypeScript الشرطية وinfer: تحويل النوع بأمثلة صغيرة

نراجع الأنواع الشرطية وتوزيع الاتحاد والقوالب النصية ونفصلها عن تحقق وقت التشغيل.

사냥개 (Sanyanggae)نُشر حُدّث 6 د

هذه ترجمة للنص الكوري الأصلي. الأصل الكوري · مراجعة الترجمة: مراجعة بالذكاء الاصطناعي

أنواع TypeScript الشرطية وinfer: تحويل النوع بأمثلة صغيرة: مخطط توضيحي لموضوعات أنواع شرطية، infer والتوزيع، تحقق التشغيل
مخطط توضيحي من سانيانغغي · أنواع شرطية · infer والتوزيع · تحقق التشغيل.

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

1. النوع الشرطي تفرع مدخله نوع

تشرح الوثيقة الرسمية للنوع الشرطي اختيار النتيجة بشرط extends. المثال ينشئ نوعاً حرفياً منطقياً بحسب كون المدخل نصاً، وليس دالة تفحص النص وقت التشغيل.

type IsText<T> = T extends string ? true : false;
type NameIsText = IsText<'parcel'>; // true
type CountIsText = IsText<3>;       // false

افترض أن دالة إشعار التسليم تأخذ معرّفاً نصياً والداخلية رقمياً. قبل الشرطي وضح سبب الفصل. إن اختلف المعنى فالتسمية مفيدة، وإن كان تنسيقاً فقط فقد يفيد توحيد المدخل. لا تُخف غموض تصميم البيانات بتقنية أنواع.

اكتب المدخل المتوقع والنتيجة أزواجاً. أمثلة صغيرة للنص والعدد والاتحاد والمفاجئ تقلل عبء التصريح المعقد. تأكد أن تعليق النتيجة يطابق استنتاج المحرر. الاسم الطبيعي قد يخفي حساباً مختلفاً.

2. توزيع الاتحاد يغير معنى المصفوفة

وضع معامل النوع مباشرة يسار الشرط يوزع على أعضاء الاتحاد. لمنع ذلك ومعاملة الاتحاد كله قارن صيغة الأقواس المربعة.

type SeparateLists<T> = T extends unknown ? T[] : never;
type Together<T> = [T] extends [unknown] ? T[] : never;
type A = SeparateLists<string | number>; // string[] | number[]
type B = Together<string | number>;      // (string | number)[]
const a: A = ['a', 'b'];
const b: B = ['a', 1];

الأولى مصفوفة نصوص فقط أو أعداد فقط؛ الثانية تمزجهما في مصفوفة. المناسب يعتمد على اشتراط رمز واحد للقائمة كلها أو تنوع عناصرها. وجود الأقواس في كليهما لا يجعل العقد واحداً.

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

3. تسمّي infer نوعاً داخل البنية وتستخرجه

تسمي infer جزءاً من البنية المطابقة في الشرطي. المثال يزيل طبقة Promise واحدة.

type OneResult<T> = T extends Promise<infer Value> ? Value : T;
type Parcel = OneResult<Promise<{ tracking: string }>>;
type ParcelList = OneResult<Promise<string[]>>;

لا ينفذ الكود عملاً غير متزامن ولا ينتظره؛ يمثل الشكل أثناء الترجمة فقط. اسم كـ Resolved قد يوهم بوصول القيمة فعلاً، فاقرأ موضع الاستخدام وسياقه. الانتظار الحقيقي يبقى في كود غير متزامن.

إن أردت النتيجة المنتظرة تكرارياً، راجع الأداة القياسية Awaited قبل توسيع المثال. بساطة التعليم غير متطلبات الأداة العامة. وثق مدخلات اختلافها عن القياسي ولماذا يلزم الفرق عند إدخال أداة للفريق.

4. ربط أسماء الأحداث بالقوالب النصية

تمثل أنواع القوالب النصية توليفات النصوص الحرفية. مثال التسليم يجمع المجال والفعل.

type Scope = 'parcel' | 'address';
type Action = 'created' | 'updated';
type EventName = `${Scope}:${Action}`;
const event: EventName = 'parcel:created';

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

مع كثرة الأحداث تهم سهولة العثور على الأسماء الفعلية. بدل تسلسل قواعد التوليف، يمكن جمع الأسماء الخارجية بملف واحد. قارن كيف يجد عضو جديد الحدث الخاطئ قبل التجريد وبعده. قيّم تعقيد النوع وقابلية الاستخدام معاً.

5. يجب فحص JSON الخارجي وقت التشغيل

وضع User أو Parcel على جواب API لا يضمن بنيته الفعلية. لنأخذ القيمة unknown ونفحص الحقول اللازمة.

function hasTracking(value: unknown): value is { tracking: string } {
  return typeof value === 'object' && value !== null
    && 'tracking' in value && typeof value.tracking === 'string';
}
const incoming: unknown = { tracking: 'DEMO-001' };
if (hasTracking(incoming)) console.log(incoming.tracking);

يفحص هذا كون tracking نصاً فقط، لا وجود الشحنة أو إذن رؤيتها. تضييق النوع وقاعدة العمل والصلاحية مسؤوليات مختلفة. تشرح وثيقة Narrowing الرسمية التضييق بالشروط.

6. ترتيب صغير لاختيار أدوات النوع

اكتب قيمتين مسموحتين وقيمتين مرفوضتين، ثم عبّر باتحاد عادي وكائن صريح. استخدم الشرطي أو infer للعلاقة المتكررة المتبقية ليظهر السبب. إن طال الفهم جداً، استخرج المشترك واترك الباقي عادياً.

أخيراً افصل اختبار النوع والتشغيل. رفض المترجم اسماً خاطئاً وشرح البرنامج حقلاً ناقصاً من الخادم متكاملان. اربط نتيجة المثال بحد المدخل الحقيقي لتخدم التحويلات تصميماً آمناً.

الأدلة والمراجع

يشرح المقال معلومات من مصادر عامة. ولا تعني الإحالة مراجعة الجهة المذكورة للمحتوى أو اعتمادها له.

عن الناشر ووسائل التواصل

مقالات أخرى في الموضوع