web-dev-qa-db-ja.com

タイプスクリプト列挙スイッチが機能しない

私は次の列挙型を持っています

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

私は列挙型の変数を持っていると仮定しましょう

var editMode = EditMode.Edit;

次のコードが機能しないのはなぜですか(デフォルトにまっすぐ進みます)?

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

私はなぜ起こるのかを見つけました。コードのどこかに、この列挙型を文字列として渡すアクティベーション関数(私はデュランダルを使用しています)があります(関数には列挙型としてマークされたパラメーターがありますが、それでも文字列です)。これが私のswitchステートメントが失敗する理由です。値を数値に変換しただけで、すべてが期待どおりに動作するようになりました。とにかく、ありがとう

16
Mantzas

私もこの問題を抱えていました。それを回避する簡単な方法:+スイッチの変数の前に署名します。

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

他の誰かがここにいて、上記のオプションが問題にならないように思われる場合は、すべての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');
}
1
ohsully