تحويل TypeScript باستخدام enum يذهب إلى الحالة الافتراضية بدلًا من الحالة الصحيحة
لدي التعداد التالي:
enum EditMode {
View = 0,
Edit = 1,
Delete = 2
}
لنفترض أن لدي متغير من نوع العدّ التعدادي
var editMode = EditMode.Edit;
لماذا لا يعمل الكود التالي (يذهب مباشرة إلى الافتراضي)؟
switch (editMode) {
case EditMode.Delete:
// ...
break;
case EditMode.Edit:
// ...
break;
default:
// ...
break;
}
الإجابة رقم 1
لديّ هذه المشكلة أيضًا. طريقة سهلة لتجاوزها: أضف علامة + قبل متغيرك في الجملة الشرطية switch، أي
switch (+editMode) {
case EditMode.Delete:
...
break;
case EditMode.Edit:
...
break;
default:
...
break;
}
الإجابة رقم 2
لقد وجدت سبب حدوث هذا: في مكان ما في الكود هناك دالة تنشيط (أنا أستخدم دوراندال) تمرر هذا التعداد كسلسلة نصية (الدالة تحتوي على المعامل موسوم على أنه تعداد لكنه لا يزال سلسلة نصية). هذا هو السبب في فشل عبارة التبديل الخاصة بي.
لقد حولت القيمة ببساطة إلى رقم والآن كل شيء يعمل كما هو متوقع.
الإجابة رقم 3
المشكلة هنا تتعلق بأنواع القيم الحرفية (النقطية) في TypeScript. عندما تقوم بهذا التعيين:
var editMode = EditMode.Edit
يُقيم TypeScript النوع كالآتي:
var editMode: 1 = EditMode.Edit
الآن، عندما تقارن قيمة يعرف TypeScript أنها يجب أن تكون 1 (EditMode.Edit) بقيمة يعرف أنها يجب أن تكون 0 (EditMode.View)، يرى كل هذا على أنه انتهاك لسلامة النوع. إذا لم يكن المتغير editMode enum، فإن TypeScript سيكتفي بالشكاية فقط، ولكن بما أنه enum، والذي لا يوجد فعليًا في JavaScript، يحصل TypeScript على التحكم في التحويل بطريقة تجعله يرمي خطأ فعليًا.
لديك خياران. يمكنك إما إجبار editMode ليكون number أو ليكون EditMode (أي أي من القيم المسموح بها لـ EditMode، وليس فقط القيمة المعينة للمتغير editMode).
شخصياً، أفضل إجباره ليكون EditMode، لأنه يبدو أكثر أمانًا من حيث النوع.
للذهاب في طريق الرقم، يمكنك القيام بما يلي، والذي تم ذكره سابقًا:
switch(+editMode)
للذهاب إلى مسار EditMode (والذي أنصح به)، يمكنك تمريره إلى دالة كما ذُكر، ولكن أحيانًا يكون من الأنظف عدم كتابة دالة. إذا كان هذا هو الحال هنا، فيمكنك مرة أخرى إجبار النوع في جملة switch:
switch(editMode as EditMode)
افعل ما تفضله، لكنني فقط أحب وضوح قول "هذا المتغير يتم التعامل معه كـ EditMode" بدلاً من "هذا المتغير من المفترض أن يكون فعليًا number، وليس Enum".
الإجابة رقم 4
غير تعريف تعداد وضع التحرير الخاص بك إلى:
enum EditMode {
View = "View",
Edit = "Edit",
Delete = "Delete"
}
الإجابة رقم 5
نسخة TypeScript 3.7.5
هذا الكود نجح بالنسبة لي
enum Seasons {
Winter,
Spring,
Summer,
Autum
}
switch (+Seasons.Winter) {
case Seasons.Winter:
console.log('weather is cold');
break;
case Seasons.Spring:
console.log('weather is spring');
break;
case Seasons.Summer:
console.log('weather is summer');
break;
default:
break;
}
أو يمكنك إعلان ثابت واستخدامه كمعامل لجملة التبديل
const season: Seasons = Seasons.Winter
switch (+season) {
case Seasons.Winter:
console.log('weather is cold');
break;
case Seasons.Spring:
console.log('weather is spring');
break;
case Seasons.Summer:
console.log('weather is summer');
break;
default:
break;
}

