Typescript Переключатель enum не работает
i имеет следующий 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
Я нашел, почему я это делаю. где-то в коде есть функция активации (я использую durandal), которая передает это перечисление как строку (функция имеет параметр, помеченный как перечисление, но все же это строка). поэтому моя инструкция switch не работает. я просто преобразовал значение в число, и теперь все работает так, как ожидалось. спасибо anyways
Ответ 2
У меня также была эта проблема. Легкий способ обойти это: добавьте знак +
перед вашей переменной в коммутаторе, т.е.
switch (+editMode) {
case EditMode.Delete:
...
break;
case EditMode.Edit:
...
break;
default:
...
break;
}
Ответ 3
Объявите ваше перечисление, используя const
:
const enum EditMode {
View = 0,
Edit = 1,
Delete = 2
}
Ответ 4
В случае, если кто-то еще окажется здесь и приведенные выше опции не являются проблемой, перепроверьте, что все ваши операторы switch ломаются/возвращаются! Компилятор Typescript достаточно умен, чтобы понять, что если ваш case
каскадно переходит к другому, то сравниваемое значение может никогда не достичь ожидаемого.
let handlerName;
switch(method){
case 'create':
handlerName = 'createHandler';
break;
case 'update';
handlerName = 'updateHandler';
// Here is where the forgotten break would go
default:
throw new Error('Unrecognized Method');
}
switch(handlerName){
case 'createHandler':
...
break;
case 'updateHandler':
// You will see an error on this case because
// the compiler knows that execution will never
// arrive here with handler === 'updateHandler'
default:
throw new Error('Unrecognized Handler');
}