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');
}