0Pricing
TypeScript Academy · درس

‏DeepPartial وDeepReadonly

ابنوا نسخًا تكرارية من Partial وReadonly

‏DeepPartial وDeepReadonly درس مجاني في TypeScript Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في TypeScript Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة TypeScript Academy 4 دروس في المجموع.

لماذا نحتاج إلى أنواع الأدوات العميقة؟

يطبّق النوعان المضمّنان Partial<T> وReadonly<T> على مستوى واحد فقط. أما الكائنات المتداخلة فتحتاج إلى إصدارات递ّية.

interface Config {
  db: { host: string; port: number };
  app: { name: string };
}
type Shallow = Partial<Config>;
// Shallow.db is still required — only top level is optional

تنفيذ DeepPartial

طبّقوا تحويلًا递ّيًا على خصائص الكائن، واجعلوا كل خاصية اختيارية، وطبّقوا DeepPartial递ّيًا إذا كانت قيمة الخاصية كائنًا.

type DeepPartial<T> = T extends object
  ? { [K in keyof T]?: DeepPartial<T[K]> }
  : T;

تطبيق DeepPartial

طبّقوا DeepPartial على نوع إعدادات متداخل، ولاحظوا كيف تصبح جميع المستويات اختيارية.

type PartialConfig = DeepPartial<Config>;
// PartialConfig.db?: { host?: string; port?: number }

const c: PartialConfig = { db: { host: "localhost" } };
// No error — all other fields are optional

تنفيذ DeepReadonly

اجعلوا كل خاصية، على كل عمق، readonly من خلال الاجتياز递ّي لأنواع الكائنات المتداخلة.

type DeepReadonly<T> = T extends object
  ? { readonly [K in keyof T]: DeepReadonly<T[K]> }
  : T;

تطبيق DeepReadonly

لا يمكن تعديل إعدادات مجمّدة بعمق على أي مستوى.

type ReadonlyConfig = DeepReadonly<Config>;
const cfg: ReadonlyConfig = { db: { host: "localhost", port: 5432 }, app: { name: "my-app" } };
// cfg.db.port = 3000; // Error: readonly

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

تحتاج المصفوفات إلى معالجة خاصة؛ إذ يجب تحويل أنواع العناصر递ّيًا بدل معاملتها ككائنات عادية.

type DeepPartial<T> =
  T extends (infer U)[]
    ? DeepPartial<U>[]
    : T extends object
      ? { [K in keyof T]?: DeepPartial<T[K]> }
      : T;

معالجة الأنواع البدائية

يجب أن تعيد الحالة الأساسية في الاجتزاء الأنواع البدائية كما هي، لا أن تغلّفها في نوع mapped للكائنات.

type DeepReadonly<T> =
  T extends string | number | boolean | null | undefined ? T
  : T extends (infer U)[] ? ReadonlyArray<DeepReadonly<U>>
  : { readonly [K in keyof T]: DeepReadonly<T[K]> };

دمج DeepPartial وDeepReadonly

يمكنكم دمجهما لإنشاء نوع عميق اختياري للخصائص وغير قابل للكتابة، لاستخدامه في تطبيق تصحيحات آمنة على الإعدادات.

type SafePatch<T> = DeepReadonly<DeepPartial<T>>;

اعتبارات الأداء

قد تؤدي الأنواع递ّية في الكائنات الكبيرة جدًا إلى إبطاء فحص أنواع TypeScript. فكّروا في وضع حدود للعمق أو استخدام التقييم الكسول في الشيفرة الحساسة للأداء.

// For very deep schemas, consider using Zod or io-ts
// which provide runtime + compile-time deep typing

استخدام عملي: تصحيحات حالة React

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

function patch<T>(state: T, changes: DeepPartial<T>): T {
  return { ...state, ...changes } as T;
}

مراجعة: أنواع الأدوات العميقة

يُعد DeepPartial وDeepReadonly نوعين mapped递ّيين يطبّقان معدّلهما على كل مستوى من كائن متداخل. عالجوا المصفوفات بشكل منفصل، واستخدموا حالات أساسية للأنواع البدائية.

تحقق سريع

ما الحالة الأساسية递ّية الصحيحة لـ DeepPartial<T>؟

ما تعلمتموه

نفّذتم DeepPartial وDeepReadonly باستخدام أنواع mapped递ّية. عالجوا المصفوفات كحالة خاصة، وأعيدوا الأنواع البدائية دائمًا دون تغيير في الحالة الأساسية.

الأسئلة الشائعة

هل درس «‏DeepPartial وDeepReadonly» مجاني؟

نعم — نص درس «‏DeepPartial وDeepReadonly» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة TypeScript Academy، انتقل إلى CoddyKit PRO. تتضمن دورة TypeScript Academy 4 دروس في المجموع.

ماذا ستتعلم في «‏DeepPartial وDeepReadonly»؟

ابنوا نسخًا تكرارية من Partial وReadonly تتمرن على TypeScript Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ TypeScript Academy؟

لا تُشترط خبرة سابقة. TypeScript Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.

كم من الوقت يستغرق درس «‏DeepPartial وDeepReadonly»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس TypeScript Academy هذا؟

نعم. كل درس في TypeScript Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. ‏DeepPartial وDeepReadonly
  2. أداتا Flatten وUnwrapPromise
  3. ‏TupleToUnion وUnionToIntersection
  4. نشر مكتبة أدوات الأنواع
← العودة إلى TypeScript Academy