Skip to content

تضييق الأنواع في TypeScript مشروح

الطرق التي يضيّق بها TypeScript نوعًا داخل فرعٍ برمجي، مجمّعة حسب التقنية: الحراس المدمجة، والمسندات المخصّصة، ودوال التوكيد، والاتحادات المميَّزة، وتدفّق المساواة والصدقية، والتضييق عبر الأسماء البديلة والمؤجَّل. كل صف يقرن التقنية بمثال من سطر واحد.

التضييق هو كيفية تحويل TypeScript نوعًا واسعًا إلى نوع أضيق داخل فرعٍ برمجي، ليستطيع إثبات أن الوصول إلى خاصية آمن. كل فحص (typeof أو in أو مسند أو مميِّز) يخبر المترجم: من هنا فصاعدًا، القيمة أكثر تحديدًا. التقنيات أدناه هي مجموعة العمل.

جدول مرجعي · 23 إدخالات
23 of 23 rows
الحراس المدمجون
يضيّق الأنواع الأولية: string وnumber وboolean وغيرها.if (typeof x === 'string') x.toUpperCase()
يضيّق إلى نسخة من صنف أو نوع قابل للإنشاء.if (e instanceof Error) e.message
يضيّق عبر التحقق من وجود خاصية على القيمة.if ('id' in obj) obj.id
يضيّق أي قيمة إلى مصفوفة؛ ويضيّق اتحادًا إلى عضوه المصفوفة.if (Array.isArray(x)) x.map(f)
الحراس المخصّصون
دالة مسند يكون مُعادها مضيّقًا للوسيطة.function isUser(x): x is User { return !!x.id }
يمكن للمسند أن يضيّق إلى اتحاد أنواع، لا إلى نوع واحد فقط.function isKey(x): x is string | number
مسند التقاطع يُبقي نوع الإدخال ويضيف حقولًا إليه.function hasId(x): x is x & { id: string }
دالة توكيد تُلقي استثناءً ما لم يكن x من النوع.function assertUser(x): asserts x is User
الاتحادات المميَّزة
يضيّق اتحادًا عبر حقل حرفي مشترك باستخدام switch أو if.type E = { kind: 'a'; a: number } | { kind: 'b'; b: string }
كل حالة case تضيّق إلى عضو واحد من الاتحاد.switch (u.kind) { case 'a': u.a }
يضيّق اتحادًا غير معنون عندما توجد خاصية على عضو واحد فقط.if ('b' in u) u.b
كل حالة هي شرط؛ والحالة المطابقة تضيّق القيمة.switch (true) { case typeof x === 'string': }
حالة default تُسند إلى never، مما يثبت أن switch شامل.default: { const x: never = u }
المساواة والتدفّق
يزيل null وundefined بعد فحص مساواة.if (x === null) return; x.toFixed()
يزيل القيم الزائفة (0 و'' وnull وundefined وNaN).if (!x) return; // x is defined here
خاصية مسلسلة صادقة تُثبت أن القيمة الأساسية موجودة.if (user?.active) user.name
توكيد اللاعدم يزيل null وundefined دون فحص.x!.toFixed(2)
الإسناد المؤكَّد: يُعلن أن x يُسند قيمة قبل قراءته.let name!: string; init()
التضييق يسري داخل الفرع وبعد الإرجاعات المبكرة.if (!arr) return; arr.map(...)
الأسماء البديلة والتضييق المؤجَّل
قيمة boolean ثابتة تحمل فحصًا تضيّق أينما اختُبرت.const isStr = typeof x === 'string'; if (isStr) …
المتغير الثابت يحتفظ بتضييقه داخل الإغلاقات التي تلتقطه.const s = get(); if (s) use(() => s.length)
منذ TS 5.4 يحتفظ let أو المعامل بتضييقه داخل الإغلاقات بعد آخر إسناد له.let n: string | null = get(); if (n) use(() => n.length)
لا يمكن استخدام unknown حتى يضيّقه حارس إلى نوع حقيقي.if (typeof u === 'string') u.length