Type-fest لـ TypeScript: دليل شامل مع أمثلة

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

ما هو Type-fest ولماذا هو مطلوب؟

\n\n

Type-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\n

Type-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، الذي يجعل جميع حقول الكائن (بما في ذلك المتداخلة) اختيارية.

\n\n
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

الطرق/الأنواع الأساسية

\n\n

لنلق نظرة على 10 من أكثر الأنواع فائدة في Type-fest. لكل منها، تم تقديم وصف ومعلمات (إن وجدت) ومثال عملي.

\n\n

1. PartialDeep

\n

ما يفعله: يجعل جميع خصائص الكائن (بما في ذلك المتداخلة) اختيارية. يمر بشكل متكرر عبر جميع المستويات.

\n

المعلمات: معلمة واحدة إلزامية - نوع الكائن.

\n
import 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\n

2. RequiredDeep

\n

ما يفعله: يجعل جميع خصائص الكائن (بما في ذلك المتداخلة) إلزامية. عكس PartialDeep.

\n

المعلمات: نوع الكائن.

\n
import 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                    

توصيات