4 يوليو 2024
كيفية كتابة أدوات TypeScript المتقدمة: Mapped و Conditional Types
شرح مفصل لأنواع TypeScript المتقدمة: الأنواع المُعيّنة (Mapped Types) لتحويل الهياكل والأنواع الشرطية (Conditional Types) لاستنتاج الأنواع المعقدة.
تتجاوز قوة TypeScript مجرد فحص الأنواع الثابتة؛ فهي تتيح لك بناء أدوات قوية تستنتج أنواعًا جديدة بناءً على أنواع موجودة. لفعل ذلك، تحتاج إلى إتقان **الأنواع المُعيّنة (Mapped Types)** و **الأنواع الشرطية (Conditional Types)**.
## الأنواع المُعيّنة (Mapped Types)
تسمح لك هذه الأنواع بالمرور عبر جميع خصائص نوع موجود وتطبيق تعديل عليها. وهي الأساس وراء الأدوات المساعدة المضمنة في TypeScript مثل `Partial<T>` و `Readonly<T>`.
```typescript
// مثال: تحويل كل الخصائص في نوع T إلى خصائص اختيارية
type Partial<T> = {
[P in keyof T]?: T[P];
};
```
يمكن استخدامها في حالات متقدمة، مثل إنشاء نوع جديد يحتوي فقط على مفاتيح النوع الأصلي ولكن بقيم مختلفة، كأن يكون كل قيمة في النوع الجديد دالة.
## الأنواع الشرطية (Conditional Types)
هذه هي عبارة "if-else" في نظام الأنواع: `T extends U ? X : Y`. تسمح لك بتحديد نوع بناءً على ما إذا كان نوع ما يتوافق مع نوع آخر. والأكثر قوة هو استخدام الكلمة المفتاحية **`infer`**.
```typescript
// مثال: استنتاج نوع القيمة المرجعة من دالة
type ReturnType<T> = T extends (...args: any[]) => infer R ? R : any;
```
هنا، `infer R` تخبر TypeScript: "إذا كان T دالة، فاستنتج نوع القيمة المرجعة (R) واجعله النوع الناتج". هذه هي التقنية التي تستخدمها المكتبات لإنشاء واجهات برمجية مرنة جدًا. إتقان هذه المفاهيم يفتح الباب لكتابة مكتبات وأنظمة أنواع قوية.