TypeScript Academy · درس

أداتا Flatten وUnwrapPromise

اكتبوا أنواعًا تفكّك هياكل الأنواع العامة المتداخلة

الدرس 2 من 413 خطوة

أداتا 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[]>;     // string

Flatten غير递ّي (مستوى واحد)

يحاكي التسطيح على مستوى واحد Array.prototype.flat(1)؛ إذ يزيل التغليف من مستوى تداخل واحد بالضبط.

type FlatOnce<T> = T extends (infer U)[] ? U : T;
type A = FlatOnce<number[][]>; // number[]
type B = FlatOnce<string[]>;   // string

Flatten递ّي

تحاكي النسخة递ّية Array.prototype.flat(Infinity) من خلال الاستمرار في الاجتياز递ّيًا حتى تختفي جميع أغلفة المصفوفات.

type Flatten<T> = T extends (infer U)[] ? Flatten<U> : T;
type C = Flatten<boolean[][][]>; // boolean

UnwrapPromise: مستوى واحد

أزل طبقة واحدة من 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[][]>>; // string

Awaited&lt;T&gt; المضمّن

توفّر 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 يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. ‏DeepPartial وDeepReadonly
  2. أداتا Flatten وUnwrapPromise
  3. ‏TupleToUnion وUnionToIntersection
  4. نشر مكتبة أدوات الأنواع
← العودة إلى TypeScript Academy