الأنواع المعتمدة على التعيين والأنواع الشرطية
أنشئ أنواعًا معتمدة على التعيين لتحويل جميع خصائص نوع ما، واستخدم الأنواع الشرطية مع infer لمنطق متقدم على مستوى الأنواع.
الأنواع المعتمدة على التعيين والأنواع الشرطية درس مجاني في Frontend Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Frontend Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Frontend Academy 4 دروس في المجموع.
الأنواع المُحوَّلة — تحويل كل خاصية
تتكرر الأنواع المُحوَّلة على مفاتيح نوع ما وتحولها. وهي الأساس الذي تقوم عليه أنواع الأدوات المساعدة Partial وReadonly وRecord.
// Partial implemented as a mapped type:
type MyPartial<T> = {
[K in keyof T]?: T[K];
};
// Readonly:
type MyReadonly<T> = {
readonly [K in keyof T]: T[K];
};إعادة تعيين المفاتيح باستخدام as
استخدم as في عبارة التعيين لإعادة تعيين أسماء المفاتيح. واجمع ذلك مع أنواع القوالب الحرفية لإجراء تحويلات قوية.
type Getters<T> = {
[K in keyof T as `get${Capitalize<string & K>}`]: () => T[K];
};
type UserGetters = Getters<{ name: string; age: number }>;
// { getName: () => string; getAge: () => number }تصفية الخصائص باستخدام never
أعِد never من إعادة تعيين مفتاح لإزالة تلك الخاصية من النوع الناتج.
// Keep only function-valued properties:
type FunctionProperties<T> = {
[K in keyof T as T[K] extends Function ? K : never]: T[K];
};الأنواع الشرطية — if/else للأنواع
تستخدم الأنواع الشرطية النمط T extends U ? TrueType : FalseType. ويُقيَّم هذا النمط على مستوى النوع، وليس في وقت التشغيل.
type IsString<T> = T extends string ? true : false;
type A = IsString<string>; // true
type B = IsString<number>; // false
type Flatten<T> = T extends Array<infer E> ? E : T;
type StrArr = Flatten<string[]>; // string
type Num = Flatten<number>; // numberالأنواع الشرطية التوزيعية
عندما يكون T اتحادًا، توزّع الأنواع الشرطية التقييم على كل عضو. ويتحقق string | number extends string ? ... من كل عضو على حدة: (string extends string ? ...) | (number extends string ? ...).
type ToArray<T> = T extends any ? T[] : never;
type StringOrNumberArray = ToArray<string | number>;
// string[] | number[] (not (string | number)[])استخدام infer لاستخراج الأنواع
تُدخل infer R متغير نوع تملؤه TypeScript. ويتيح ذلك التقاط أجزاء من بنية النوع.
type UnwrapPromise<T> = T extends Promise<infer U> ? U : T;
type Resolved = UnwrapPromise<Promise<string>>; // string
type Direct = UnwrapPromise<number>; // numberأنواع القوالب الحرفية
تستخدم أنواع القوالب الحرفية صيغة backtick نفسها المستخدمة في القوالب الحرفية، لكن على مستوى النوع، فتنشئ أنواع اتحاد من مجموعات من القيم الحرفية النصية.
type Side = 'top' | 'right' | 'bottom' | 'left';
type PaddingKey = `padding-${Side}`;
// 'padding-top' | 'padding-right' | 'padding-bottom' | 'padding-left'
type EventName<T extends string> = `on${Capitalize<T>}`;
type ClickEvent = EventName<'click'>; // 'onClick'دمج الأنواع المُحوَّلة والشرطية
تجمع أقوى أنماط TypeScript بين النوعين. فجميع الأنواع المضمّنة required وpartial وreadonly وrecord هي أنواع مُحوَّلة.
// Make all functions in an object async:
type Asyncify<T> = {
[K in keyof T]: T[K] extends (...args: infer A) => infer R
? (...args: A) => Promise<R>
: T[K];
};DeepPartial — نوع أداة تكراري
يعمل النوع المضمّن Partial على مستوى واحد فقط. أما DeepPartial فيُجري تكرارًا داخل الكائنات المتداخلة.
type DeepPartial<T> = {
[K in keyof T]?: T[K] extends object ? DeepPartial<T[K]> : T[K];
};استخدام عملي: أنواع استجابات API
تتيح الأنواع المُعيَّنة والأنواع الشرطية اشتقاق أنواع قوية من API، مثل استخراج خصائص الكائن القابلة للتسلسل بصيغة JSON فقط.
تجنّب الإفراط في التصميم
قد تجعل التلاعبات المعقدة بالأنواع الشيفرة صعبة الفهم. اسأل دائمًا: هل سيكون اسم نوع مستعار أو واجهة أبسط أوضح؟ ينبغي للأنواع توثيق الغرض، لا استعراض إتقان TypeScript.
اختبار سريع
ما القيمة التي يُقيَّم إليها T extends U ? A : B عندما يكون T نوع اتحاد؟
مراجعة: الأنواع المُعيَّنة والشرطية
تكرّر الأنواع المُعيَّنة العملية على المفاتيح باستخدام [K in keyof T]. استخدم as لإعادة تعيين المفاتيح. أعد never لتصفية العناصر. الأنواع الشرطية: T extends U ? A : B. تستخرج infer متغيرات الأنواع. تنشئ أنواع القوالب الحرفية اتحادات من السلاسل النصية. ادمج النوعين لإجراء تحويلات قوية للأنواع، مثل DeepPartial وAsyncify.
الأسئلة الشائعة
هل درس «الأنواع المعتمدة على التعيين والأنواع الشرطية» مجاني؟
نعم — نص درس «الأنواع المعتمدة على التعيين والأنواع الشرطية» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Frontend Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Frontend Academy 4 دروس في المجموع.
ماذا ستتعلم في «الأنواع المعتمدة على التعيين والأنواع الشرطية»؟
أنشئ أنواعًا معتمدة على التعيين لتحويل جميع خصائص نوع ما، واستخدم الأنواع الشرطية مع infer لمنطق متقدم على مستوى الأنواع. تتمرن على Frontend Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Frontend Academy؟
لا تُشترط خبرة سابقة. Frontend Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «الأنواع المعتمدة على التعيين والأنواع الشرطية»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Frontend Academy هذا؟
نعم. كل درس في Frontend Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- الأنواع العامة: T وextends والقيود
- أنواع الأدوات: Partial وRequired وPick وOmit
- الأنواع المعتمدة على التعيين والأنواع الشرطية
- تضييق الأنواع: typeof وinstanceof والاتحادات المميّزة