as const تأكيد as const
آخر تحديث: 2026-10-22
as const تأكيد as const
يجمّد as const الحرفي بأكمله في أعمق نوع ثابت ممكن: تصبح كل الخصائص readonly، وتضيق كل القيم إلى نوعها الحرفي (سلاسل وأرقام وقيم منطقية)، وتتحول المصفوفات إلى صفوف (tuples) للقراءة فقط. وهو جوهر النمط الكلاسيكي لاشتقاق أنواع اتحادية من جدول ثوابت.
| المجموعة | تضييق الأنواع والتأكيدات |
|---|---|
| النوع | عامل |
| الوضع الصارم | غير مطلوب |
ℹ️ معلومة يحوّل المحرر لغة TypeScript إلى JavaScript ثم يشغّلها (بدون فحص أنواع)؛ راجع ناتج كل مثال لنتيجة فحص الأنواع.
📝 الصيغة
const ROLES = ["admin", "editor", "viewer"] as const;
type Role = (typeof ROLES)[number]; // "admin" | "editor" | "viewer"
const THEME = { mode: "dark", fontSize: 14 } as const;
// { readonly mode: "dark"; readonly fontSize: 14 }
⚙️ المعاملات
| as const | يُطبَّق على تعبير حرفي: يستنتج أضيق الأنواع الحرفية للقراءة فقط بدلًا من الأنواع الواسعة الافتراضية (string وnumber والمصفوفات القابلة للتغيير) |
|---|
القيمة المُعادة:لا أثر له في وقت التشغيل — يزول as const تمامًا بعد الترجمة؛ إنه يستبدل النوع المستنتج في وقت الترجمة فقط بأضيق نسخة للقراءة فقط منه.
▶ مثال
عدّل الكود أدناه واضغط «جرّب» لرؤية نتيجة التحويل:
الناتج:
admin/editor/viewer
role set to editor
dark 14
(مخرجات التشغيل بعد الترجمة. نجاح setRole("editor") سببه أن as const جعل Role اتحادًا حرفيًا — فمن دون as const كان سيُستنتج ROLES بوصفه string[] ويفشل استدعاء setRole("editor") في الترجمة)
💡 نقاط مهمة
ℹ️ معلومة التأثير «عميق»: خصائص الكائنات المتداخلة تصبح هي الأخرى readonly وتضيق إلى حرفيات. وهذا ما يميزها عن Readonly<T> (السطحية).
⚠️ تنبيه بعد as const لا يمكن تعديل أي خاصية ولا الإضافة إلى المصفوفات push — فالخطأ يظهر في وقت الترجمة. لبنك نسخة قابلة للتغيير استخدم عامل الانتشار: { ...DEFAULT_THEME, mode: "light" }.
💡 تلميح تركيبة كلاسيكية: (typeof CONST)[number] تحوّل مصفوفة as const إلى اتحاد حرفي، فيصبح جدول الثوابت «مصدر الحقيقة الوحيد» — أضف دورًا فيلحق به النوع تلقائيًا.
🏷️ تضييق الأنواع والتأكيدات ذو صلة
💡 حالات ذات صلة
المزيد من الحالات قادم قريبًا.
📚 دروس ذات صلة
❓ أسئلة شائعة
س ما الفرق بين المتغير const و as const؟
ج يمنع const إعادة إسناد المتغير فقط — تبقى خصائص الكائن قابلة للتغيير ويبقى الاستنتاج واسعًا (string)؛ أما as const فيضيق النوع ذاته إلى حرفيات للقراءة فقط. الأول يقفل الربط والثاني يقفل النوع.
س كيف أشتق نوعًا اتحاديًا من مصفوفة as const؟
ج خطوتان: typeof ARR يأخذ نوع المصفوفة، ثم الوصول المفهرس [number] يوحّد أنواع كل العناصر: type Role = (typeof ROLES)[number]. هذا النمط الرسمي يجنّبك صيانة قائمتين يدويتين.
س هل ينبغي إضافة as const إلى كل كائن حرفي؟
ج لا. يناسب «الثوابت الحقيقية» فحسب: لقطات الإعدادات، جداول قيم التعداد، أنواع الإجراءات؛ أما الكائنات التي ستُعدَّل لاحقًا أو تُملأ من حالة متغيرة فلا تضفه لها، وإلا واجهت أخطاء readonly في كل مرة واضطررت إلى التكديس بالتأكيدات.