Kodokon kodokon.com

التعدادات enums وتوكيدات const: البدائل الحديثة

افهم حدود التعدادات enums، واشتق أنواعك من ثوابت مجمّدة باستخدام as const.

7 دقيقة · 3 أسئلة

افتح هذا الدرس في Kodokon

كان enum جزءًا من اللغة منذ أيامها الأولى، وستصادفه في كثير من قواعد الشيفرة. فهو يجمّع ثوابت مسماة تحت نوع واحد، صالحة للاستخدام كقيمة وكتوصيف على السواء.

TYPESCRIPT
enum Role {
  User = "USER",
  Admin = "ADMIN",
}

function canDelete(role: Role): boolean {
  return role === Role.Admin;
}
تعداد enum نصي كلاسيكي

ومع ذلك، فإن المنظومة الحديثة تبتعد عنه. فالـenum صياغة غير موجودة في JavaScript: المترجم يُصدر كائنًا أثناء التشغيل، ما يعقّد بعض الأدوات ويتعارض مع خيار erasableSyntaxOnly. البديل: كائن عادي مجمَّد بـas const، منه تشتق النوع.

TYPESCRIPT
const ROLES = {
  User: "USER",
  Admin: "ADMIN",
} as const;

type Role = (typeof ROLES)[keyof typeof ROLES];

function canDelete(role: Role): boolean {
  return role === ROLES.Admin;
}
كائن as const مع نوع مشتق، وهو المكافئ الحديث

تعمل as const أيضًا على المصفوفات: يصير كل عنصر قيمة حرفية للقراءة فقط، وينتج (typeof SIZES)[number] اتحاد القيم. مصدر حقيقة واحد يغذّي الشيفرة العاملة والأنواع معًا.

TYPESCRIPT
const SIZES = ["sm", "md", "lg"] as const;

type Size = (typeof SIZES)[number];

function isSize(value: string): value is Size {
  return (SIZES as readonly string[]).includes(value);
}
مصفوفة as const: قابلة للتكرار أثناء التشغيل، واتحاد على مستوى الأنواع

اختبار المعرفة

تأكّد من أنك تذكّرت النقاط الأساسية في هذا الدرس.

  1. ما الفرق الجوهري الذي يفصل تعدادًا enum عن كائن مجمَّد بـ as const؟
    • التعداد enum صياغة خاصة بـ TypeScript تولّد شيفرة، بينما يبقى كائن as const مجرد JavaScript
    • كائن as const أبطأ أثناء التشغيل
    • يمكن أن يحتوي التعداد enum على أرقام فقط
  2. ماذا تُنتج as const عند تطبيقها على المصفوفة ['sm', 'md']؟
    • string[]
    • صفًّا (tuple) للقراءة فقط من أنواع حرفية
    • مصفوفة قابلة للتعديل من النوع Array<'sm' | 'md'>
    • خطأ ترجمة
  3. كيف تحصل على اتحاد قيم كائن ROLES مجمَّد بـ as const؟
    • keyof typeof ROLES
    • (typeof ROLES)[keyof typeof ROLES]
    • typeof ROLES