web-dev-qa-db-fra.com

Le commutateur d'énumération tapuscrit ne fonctionne pas

j'ai l'énumération suivante

enum EditMode {
    View = 0,
    Edit = 1,
    Delete = 2
}

Supposons que j'ai une variable de type enum

var editMode = EditMode.Edit;

Pourquoi le code suivant ne fonctionne-t-il pas (passe directement à la valeur par défaut)?

switch (editMode) {
    case EditMode.Delete:
        ...
        break;
    case EditMode.Edit:
        ...
        break;
    default:
        ...
        break;
    }
40
Mantzas

j'ai trouvé pourquoi j'arrive. quelque part dans le code, il y a une fonction d'activation (j'utilise durandal) qui passe cette énumération sous forme de chaîne (la fonction a le paramètre marqué comme une énumération mais c'est toujours une chaîne). c'est pourquoi mon instruction switch échoue. j'ai simplement converti la valeur en nombre et maintenant tout fonctionne comme prévu. Merci quand même

16
Mantzas

J'ai aussi eu ce problème. Un moyen simple de le contourner: ajoutez un + signe avant votre variable dans le commutateur, c'est-à-dire.

switch (+editMode) {
    case EditMode.Delete:
        ...
        break;
    case EditMode.Edit:
        ...
        break;
    default:
        ...
        break;
    }
59
Shaul Behr

Dans le cas où quelqu'un d'autre se retrouverait ici et que les options ci-dessus ne semblent pas être le problème, vérifiez que toutes vos instructions switch se cassent/retournent! Le compilateur TypeScript est suffisamment intelligent pour voir que si votre case passe en cascade vers un autre, la valeur sur laquelle vous comparez peut ne jamais atteindre le cas auquel vous vous attendez.

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