حالات استخدام infer العملية: فك تغليف الوعود
فكّوا تغليف أنواع Promise وArray والأغلفة المخصّصة
حالات استخدام infer العملية: فك تغليف الوعود درس مجاني في TypeScript Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في TypeScript Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة TypeScript Academy 4 دروس في المجموع.
مشكلة فك التغليف
عند العمل مع الشيفرة غير المتزامنة، غالبًا ما تتلقون Promise وتحتاجون إلى T الأساسي. تجعل الكلمة المفتاحية infer عملية الاستخراج هذه قابلة لإعادة الاستخدام.
type Awaited<T> = T extends Promise<infer U> ? U : T;
type A = Awaited<Promise<string>>; // string
type B = Awaited<number>; // numberأداة Awaited المضمّنة
قدم TypeScript 4.5 النوع المضمّن Awaited، الذي يعالج الوعود المتداخلة بشكل عودي.
type A = Awaited<Promise<Promise<string>>>; // string
// Handles arbitrary nesting automaticallyفك التغليف بعمق مخصص
قبل أن تصبح Awaited مضمّنة، كان المطورون يستخدمون أنواعًا عودية مع infer لفك تغليف الوعود.
type DeepAwaited<T> =
T extends Promise<infer U> ? DeepAwaited<U> : T;
type A = DeepAwaited<Promise<Promise<number>>>; // numberفك تغليف عناصر المصفوفة
يستخرج نمط infer نفسه نوع العنصر من المصفوفة، وهو مكافئ لأسلوب T[number] المضمّن.
type Element<T> = T extends (infer U)[] ? U : never;
type A = Element<string[]>; // string
type B = Element<number[]>; // numberفك تغليف أنواع Observable
بالنسبة إلى Observable في RxJS، يستخرج infer النوع الذي يتم إصداره.
type ObservableType<T> = T extends Observable<infer U> ? U : never;
type A = ObservableType<Observable<User>>; // Userفك تغليف القيمة المعادة للدالة
ادمجوا بين ReturnType وAwaited للحصول على القيمة التي تحل إليها الدالة غير المتزامنة.
async function getUser(): Promise<User> { /* ... */ }
type UserResult = Awaited<ReturnType<typeof getUser>>; // Userفك تغليف الأغلفة المتداخلة
يمكنكم تسلسل infer للتعامل مع الأنواع المغلفة في عدة طبقات، مثل Promise.
type UnwrapPromiseArray<T> =
T extends Promise<infer U>
? U extends (infer V)[]
? V
: U
: T;
type A = UnwrapPromiseArray<Promise<User[]>>; // Userفك التغليف الشرطي بناءً على البنية
استخدموا infer لفك تغليف أنواع معينة فقط بشكل شرطي، مع ترك الأنواع الأخرى دون تغيير.
type MaybeUnwrap<T> =
T extends Promise<infer U> ? U : T extends (infer V)[] ? V : T;
type A = MaybeUnwrap<Promise<string>>; // string
type B = MaybeUnwrap<number[]>; // number
type C = MaybeUnwrap<boolean>; // booleanغلاف fetch لواجهة API مقيّدة بالأنواع
يُعد غلاف fetch العام الذي يعيد نوع البيانات التي تم حلها تطبيقًا كلاسيكيًا لفك التغليف باستخدام infer.
async function fetchData<T>(url: string): Promise<T> {
const res = await fetch(url);
return res.json() as T;
}
type UserData = Awaited<ReturnType<typeof fetchData<User>>>; // Userفك تغليف آمن من الأخطاء
يتيح نمط Result، عند دمجه مع infer، استخراج نوع النجاح من اتحاد مميّز.
type Ok<T> = { ok: true; value: T };
type Err = { ok: false; error: string };
type ExtractOk<T> = T extends Ok<infer V> ? V : never;
type A = ExtractOk<Ok<number> | Err>; // numberمراجعة سريعة: فك التغليف باستخدام infer
تُعد الكلمة المفتاحية infer أداة متعددة الاستخدامات لاستخراج الأنواع من الأغلفة — الوعود والمصفوفات وObservable وأنواع Result. يتولى Awaited المضمّن فك التغليف غير المتزامن؛ واستخدموا أنواعًا مخصصة للبُنى الأخرى.
اختبار سريع
ما أفضل طريقة للحصول على نوع القيمة التي تحل إليها الدالة غير المتزامنة؟
ما تعلّمتموه
يُعد فك التغليف القائم على infer أداة عملية لشيفرة TypeScript غير المتزامنة. استخدموا Awaited المضمّن مع الوعود، وأنشئوا أنواع فك تغليف مخصصة للمصفوفات وObservable وأنماط Result.
الأسئلة الشائعة
هل درس «حالات استخدام infer العملية: فك تغليف الوعود» مجاني؟
نعم — نص درس «حالات استخدام infer العملية: فك تغليف الوعود» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة TypeScript Academy، انتقل إلى CoddyKit PRO. تتضمن دورة TypeScript Academy 4 دروس في المجموع.
ماذا ستتعلم في «حالات استخدام infer العملية: فك تغليف الوعود»؟
فكّوا تغليف أنواع Promise وArray والأغلفة المخصّصة تتمرن على TypeScript Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ TypeScript Academy؟
لا تُشترط خبرة سابقة. TypeScript Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «حالات استخدام infer العملية: فك تغليف الوعود»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس TypeScript Academy هذا؟
نعم. كل درس في TypeScript Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- فهم infer في الأنواع الشرطية
- بناء ReturnType وParameters من الصفر
- أنماط الاستدلال المتداخلة بعمق
- حالات استخدام infer العملية: فك تغليف الوعود