ما هو Type-fest ولماذا هو مطلوب؟
\n\nType-fest هي مجموعة من الأنواع المساعدة (Utility Types) لـ TypeScript، تم إنشاؤها بواسطة مجتمع Sindre Sorhus. توفر هذه المكتبة عشرات الأنواع الجاهزة التي تحل المهام اليومية عند التطوير باستخدام TypeScript: من التحويلات البسيطة (مثل جعل جميع حقول الكائن اختيارية) إلى الأنواع الشرطية المعقدة (مثل استخراج نوع القيمة من Promise).
\n\nلماذا هذه المكتبة مطلوبة؟ TypeScript هي لغة قوية، لكن أنواعها المدمجة (Partial، Required، Pick، Record) تغطي فقط السيناريوهات الأساسية. في المشاريع الحقيقية، غالبًا ما تكون هناك حاجة إلى تركيبات أكثر تحديدًا: الدمج العميق للكائنات، وأنواع للعمل مع JSON، والكتابة الصارمة للثوابت، واستخراج الأنواع من الهياكل المعقدة، وما إلى ذلك. Type-fest يغنيك عن كتابة هذه الأنواع يدويًا، مما يوفر الوقت ويقلل من احتمالية الأخطاء.
\n\nالمكتبة مدعومة بنشاط، ولديها أكثر من 10000 نجمة على GitHub، وتُستخدم في مشاريع كبيرة مثل Next.js و Vite و Expo.
\n\nالتثبيت
\n\nType-fest هي حزمة npm يتم تثبيتها كاعتماد تطوير (dev-dependency) (لأن الأنواع لا تؤثر على وقت التشغيل).
\n\n# npm\nnpm install --save-dev type-fest\n\n# yarn\nyarn add --dev type-fest\n\n# pnpm\npnpm add --save-dev type-fest\n\nملاحظة: لا يتم تثبيت المكتبة عبر pip - فهي مخصصة حصريًا لـ TypeScript/JavaScript.
\n\nبداية سريعة
\n\nبعد التثبيت، يمكنك استيراد أي نوع من المكتبة. لنلق نظرة على مثال بسيط - استخدام النوع PartialDeep، الذي يجعل جميع حقول الكائن (بما في ذلك المتداخلة) اختيارية.
import type { PartialDeep } from 'type-fest';\n\ninterface User {\n id: number;\n name: string;\n address: {\n city: string;\n zip: number;\n };\n}\n\n// Partial العادي يجعل فقط حقول المستوى الأول اختيارية\ntype PartialUser = Partial<User>;\n// { id?: number; name?: string; address?: { city: string; zip: number; } }\n\n// PartialDeep يجعل جميع الحقول المتداخلة اختيارية\ntype DeepPartialUser = PartialDeep<User>;\n// { id?: number; name?: string; address?: { city?: string; zip?: number; } }\n\nconst user: DeepPartialUser = {\n name: 'Alice',\n address: {\n city: 'Wonderland'\n // zip يمكن حذفه\n }\n};\n\nكما ترى، PartialDeep يمر تلقائيًا عبر جميع مستويات التداخل - وهذا ما كان عليك كتابته يدويًا باستخدام الأنواع العودية.
الطرق/الأنواع الأساسية
\n\nلنلق نظرة على 10 من أكثر الأنواع فائدة في Type-fest. لكل منها، تم تقديم وصف ومعلمات (إن وجدت) ومثال عملي.
\n\n1. PartialDeep
\nما يفعله: يجعل جميع خصائص الكائن (بما في ذلك المتداخلة) اختيارية. يمر بشكل متكرر عبر جميع المستويات.
\nالمعلمات: معلمة واحدة إلزامية - نوع الكائن.
\nimport type { PartialDeep } from 'type-fest';\n\ninterface Config {\n server: {\n host: string;\n port: number;\n };\n debug: boolean;\n}\n\ntype PartialConfig = PartialDeep<Config>;\n// {\n// server?: {\n// host?: string;\n// port?: number;\n// };\n// debug?: boolean;\n// }\n\nconst config: PartialConfig = {\n server: {\n host: 'localhost'\n // port غير محدد - لا يوجد خطأ\n }\n};\n\n2. RequiredDeep
\nما يفعله: يجعل جميع خصائص الكائن (بما في ذلك المتداخلة) إلزامية. عكس PartialDeep.
المعلمات: نوع الكائن.
\nimport type { RequiredDeep } from 'type-fest';\n\ninterface User {\n name?: string;\n address?: {\n city?: string;\n };\n}\n\ntype StrictUser = RequiredDeep<User>;\n// {\n// name: string;\n// address