أداتا Flatten وUnwrapPromise
اكتبوا أنواعًا تفكّك هياكل الأنواع العامة المتداخلة
أداتا Flatten وUnwrapPromise درس مجاني في TypeScript Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في TypeScript Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة TypeScript Academy 4 دروس في المجموع.
مشكلة Flatten
يمكن أن تكون مصفوفات JavaScript متداخلة. يزيل النوع المساعد Flatten<T> أغلفة المصفوفات من النوع递ّيًا، ويعيد نوع العنصر الأعمق.
type Flatten<T> = T extends (infer U)[] ? Flatten<U> : T;
type A = Flatten<number[][][]>; // number
type B = Flatten<string[]>; // stringFlatten غير递ّي (مستوى واحد)
يحاكي التسطيح على مستوى واحد Array.prototype.flat(1)؛ إذ يزيل التغليف من مستوى تداخل واحد بالضبط.
type FlatOnce<T> = T extends (infer U)[] ? U : T;
type A = FlatOnce<number[][]>; // number[]
type B = FlatOnce<string[]>; // stringFlatten递ّي
تحاكي النسخة递ّية Array.prototype.flat(Infinity) من خلال الاستمرار في الاجتياز递ّيًا حتى تختفي جميع أغلفة المصفوفات.
type Flatten<T> = T extends (infer U)[] ? Flatten<U> : T;
type C = Flatten<boolean[][][]>; // booleanUnwrapPromise: مستوى واحد
أزل طبقة واحدة من Promise باستخدام infer.
type UnwrapPromise<T> = T extends Promise<infer U> ? U : T;
type D = UnwrapPromise<Promise<string>>; // string
type E = UnwrapPromise<number>; // numberإزالة التغليف递ّية من UnwrapPromise
أزلوا التغليف من الوعود المتداخلة递ّيًا، وهو ما يعادل Awaited<T> المضمّن.
type DeepUnwrap<T> = T extends Promise<infer U> ? DeepUnwrap<U> : T;
type F = DeepUnwrap<Promise<Promise<number>>>; // numberدمج Flatten وUnwrapPromise
يعالج نوع مدمج كلًا من الوعود والمصفوفات، وهو مفيد للدوال غير المتزامنة التي تعيد مصفوفات.
type Simplify<T> =
T extends Promise<infer U> ? Simplify<U>
: T extends (infer V)[] ? Simplify<V>
: T;
type G = Simplify<Promise<string[][]>>; // stringAwaited<T> المضمّن
توفّر TypeScript 4.5 والإصدارات الأحدث Awaited<T>، الذي يزيل التغليف递ّيًا من الأنواع thenable، بما في ذلك thenable غير المستندة إلى Promise.
type H = Awaited<Promise<Promise<string>>>; // string
// Also handles custom thenables with .then()إزالة التغليف من قيم Map
يستخرج نمط infer نفسه أنواع القيم من Map<K, V>.
type MapValue<T> = T extends Map<any, infer V> ? V : never;
type I = MapValue<Map<string, number[]>>; // number[]FlattenObject: دمج الواجهات المتداخلة
يدمج مسطّح الكائنات على مستوى الأنواع أنواع الكائنات المتداخلة، وهو أكثر تعقيدًا لكنه مفيد لدمج الإعدادات العميقة.
// This requires recursive mapped types + intersection spreading
// See the DeepPartial lesson for the base patternاستخدام عملي: إزالة التغليف من استجابات API
أزيلوا أغلفة استجابات API المتداخلة للحصول على نوع البيانات دون تأكيدات أنواع يدوية.
type ApiData<T> = { data: T; status: number };
type ExtractData<T> = T extends ApiData<infer D> ? D : T;
type J = ExtractData<ApiData<User[]>>; // User[]مراجعة: Flatten وUnwrap
يستخدم Flatten وUnwrapPromise أنواعًا شرطية递ّية مع infer لإزالة أغلفة الأنواع. استخدموا Awaited<T> لإزالة التغليف من الوعود، واكتبوا اجتزاءً递ّيًا مخصصًا للبنى الأخرى.
تحقق سريع
ما القيمة التي يعيدها Flatten<number[][][]>؟
ما تعلمتموه
يُعد Flatten وUnwrapPromise نوعين شرطيين递ّيين يزيلان الأغلفة العامة. ادمجوهما لتبسيط الأنواع المتداخلة المعقدة، واستخدموا Awaited<T> المضمّن لسلاسل الوعود.
تعلم TypeScript مع معلم ذكاء اصطناعي — مجانًا
اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.
- الدورات
- 101
- الدروس
- 352
الأسئلة الشائعة
هل درس «أداتا Flatten وUnwrapPromise» مجاني؟
نعم — نص درس «أداتا Flatten وUnwrapPromise» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة TypeScript Academy، انتقل إلى CoddyKit PRO. تتضمن دورة TypeScript Academy 4 دروس في المجموع.
ماذا ستتعلم في «أداتا Flatten وUnwrapPromise»؟
اكتبوا أنواعًا تفكّك هياكل الأنواع العامة المتداخلة تتمرن على TypeScript Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ TypeScript Academy؟
لا تُشترط خبرة سابقة. TypeScript Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «أداتا Flatten وUnwrapPromise»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس TypeScript Academy هذا؟
نعم. كل درس في TypeScript Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- DeepPartial وDeepReadonly
- أداتا Flatten وUnwrapPromise
- TupleToUnion وUnionToIntersection
- نشر مكتبة أدوات الأنواع