TypeScript / المتوسط / الدرس 8
الأنواع المحولة وأنواع الأدوات
اشتق عروض كائن مرتبطة مع حفظ الاختيار والتعديل دون خلط تحويل النوع بمعالجة الكائن أثناء التنفيذ.
في هذه الصفحة
أهداف الدرس
- تحويل المفاتيح المعروفة وتطبيق readonly والاختيار.
- استخدام Pick وOmit وPartial وReadonly وRecord بوعي.
- تنفيذ التحديث والتسلسل الفعليين منفصلين.
اشتقاق عائلة من نموذج واحد
تمر الأنواع المحولة على اتحاد مفاتيح لبناء نوع كائن آخر وتحفظ تزامن الأعلام والعروض مع النموذج. يحدث ذلك في الفاحص دون حلقة تنشئ الخصائص؛ فابنِ الكائن الفعلي بالشيفرة. فضّل تحويلًا مسمى واضحًا على تعبير كثيف مكرر. قد يغير المصدر كل العروض المشتقة تلقائيًا، وهو مفيد فقط إذا وجب تطورها معًا. راجع التوافق قبل كشف كل مفاتيح التمثيل الداخلي.
تحويل أسماء الخصائص إلى سياسة قيم أخرى
يحول المثال مفاتيح القنوات إلى قيم منطقية، ويرفض الحرفي نقص مفتاح معلوم أو قيمة غير منطقية. توجد الأعلام لأن الحرفي ينشئها لا لأن Flags تعمل عند البدء. يمكن إضافة أو إزالة readonly والاختيار بـ-readonly و-?، وهي تغير العرض ولا تجمد الكائن أو تملأه. ميّز المفاتيح المحدودة من قاموس نص عام قد يغيب مفتاحه.
export {};
type Flags<T> = { [K in keyof T]: boolean };
type Channels = { email: string; sms: string };
const flags: Flags<Channels> = { email: true, sms: false };
console.log(JSON.stringify(flags));
{"email":true,"sms":false}
يحوي الكائن العلمين المنشأين صراحة، ويفرض النوع علاقتهما أثناء الفحص فقط.
استخدام تحديث محدود بدل صلاحية الكائن كاملًا
تختار Pick المفاتيح وتستبعد Omit وتجعل Partial الاختيار وتمنع Readonly الكتابة عبر العرض، وغالبها سطحي. يسمح المثال بتحديث name فقط ويستبعد id. مع الاختيار الدقيق يعني إغفال الاسم عدم استبداله ولا تُقبل undefined كنص. ينشئ الانتشار كائنًا خارجيًا جديدًا ويحفظ المصدر. افحص التحديث الخارجي وصلاحياته؛ فلا يحذف النوع حقولًا زائدة فعلية.
export {};
type User = { id: number; name: string };
type NamePatch = Partial<Pick<User, "name">>;
function update(user: Readonly<User>, patch: NamePatch): User { return { ...user, ...patch }; }
const original: User = { id: 7, name: "Mira" };
const changed = update(original, { name: "Lina" });
console.log(JSON.stringify(changed), original.name);
{"id":7,"name":"Lina"} Mira
يغير الكائن الجديد الاسم ويحفظ المعرّف ويبقى اسم الأصل Mira.
النوع المحول ليس محول بيانات
لا تحذف Omit السر من قيمة ولا تجمد Readonly الداخل. ليست Partial بروتوكول تحديث كاملًا؛ فقد يلزم التفريق بين عدم التغيير والمسح والاستبدال. مثّلها صراحة بدل تحميل undefined أو null معاني بلا عقد. تمثل Record مفاتيح محدودة أو قاموسًا ولا تنشئ عناصر. اختبر الخصائص الزائدة من JavaScript غير المفحوص وارفضها أو انتقها قبل التطبيق. لا تستبدل أدوات النوع فحص المخطط والصلاحيات.
وضوح الاشتقاق للمستهلك
تفيد الأدوات لعلاقة ثابتة، وقد تخفي السلاسل الطويلة التشخيص وتكشف التنفيذ عرضيًا. صدّر أسماء مجال واختبر البنى المقبولة. تعيد خرائط المفاتيح التسمية أو التصفية وتولد القوالب أسماء أحداث لاحقًا. لا تبنِ تحويلًا عميقًا عامًا قبل تعريف المصفوفات والدوال والاختيار والدورات. للتكرار النوعي كلفة وقد ينتج دقة ظاهرية بلا عملية فعلية؛ فضّل عقدًا أصغر صادقًا.
الأخطاء الشائعة وإصلاحها
توقع حذف بيانات سرية عبر Omit.
- لماذا يحدث؟
- عومل العرض الساكن كترشيح تنفيذي.
- كيف تصلحه؟
- ابنِ كائن ناتج منتقى صراحة.
- كيف تتجنب تكراره؟
- افحص مفاتيح التسلسل فعليًا.
تحديثات Partial تمسح قيمًا عرضيًا.
- لماذا يحدث؟
- لا توجد سياسة تفصل الإغفال والمسح.
- كيف تصلحه؟
- مثّل التحديث وافحصه قبل الدمج.
- كيف تتجنب تكراره؟
- اختبر الإغفال والفراغ وnull وundefined عمدًا.
أداة نوع عميقة يصعب تشخيصها.
- لماذا يحدث؟
- حل تكرار معقد محل عقد واضح.
- كيف تصلحه؟
- استخدم تحويلات مسماة أصغر ومتطلبات محدودة.
- كيف تتجنب تكراره؟
- قِس كلفة الفاحص ووضوح أخطائه.
اختبر فهمك
1. استدع update(original, {}) وحدّد القيمة والهوية وما يأتي من النوع.
اعرض الحل المشروح
تكون القيمة بالمعرّف سبعة والاسم Mira، لكن الانتشار ينشئ هوية خارجية أخرى. تسمح NamePatch بالإغفال ولا تنسخ بنفسها. يحدد التنفيذ الهوية والنسخ السطحي، وتبقى مراجع الداخل مشتركة إذا أضيفت دون سياسة أخرى.
2. صمّم تحديثًا يمسح nickname القابل لـnull ويتركه ثابتًا عند الإغفال واشرح نقص Partial وحدها.
اعرض الحل المشروح
استخدم nickname اختياريًا بقيمة string | null: الإغفال بلا تغيير وnull للمسح والنص للاستبدال. فعّل الاختيار الدقيق وافحص الخارج. تساعد Partial في الاختيار وتفرض الشيفرة والفحص العمليات وترفض الحقول الأخرى.
أهم ما تعلمته
- تشتق الأنواع المحولة علاقات ساكنة.
- لا تنسخ الأدوات القيم أو تحذفها أو تفحصها.
- حدّد دلالة التحديث قبل تركيب التحويلات.