Преобразовать вложенное другое, если инструкция в оператор switch в JavaScript

newDev спросил: 13 июня 2018 в 05:38 в: javascript

У меня есть следующая конечная точка с вложенным (if) else if statement

@Patch("/games/:id")
  @HttpCode(200)
  async updateGame(@Param("id") id: number, @Body() update: Partial<Game>) {    const updatedGame = await Game.findOne(id);
    if (!updatedGame) {
      throw new NotFoundError("HTTP 404 Not Found: No Games Here");
    } else if (update.color && !validColor(update.color)) {
      throw new BadRequestError("HTTP 400 Bad Request: No Such Color");
    } else if (
      update.board !== undefined &&
      moves(update.board, updatedGame.board) > 1
    ) {
      throw new BadRequestError(
        "HTTP 400 Bad Request:  Only one move allowed. Wait your turn"
      );
    } else {
      console.log("Game has been updated");
      return Game.merge(updatedGame, update).save();
    }
  }

И я хотел бы преобразовать его в оператор switch для удобочитаемости. Я попробовал несколько попыток, но почему-то значения константных переменных не читаются.

следующее: моя инструкция switch пытается заменить else if list

switch(updatedGame){
  case (!updatedGame):
  throw new NotFoundError("HTTP 404 Not Found: No Games Here")
  case(update.color && !validColor(update.color)):
  throw new BadRequestError("HTTP 400 Bad Request: No Such Color")
  case(update.board !== undefined && moves(update.board, updatedGame.board) > 1):
  throw new BadRequestError("HTTP 400 Bad Request:  Only one move allowed. Wait your turn")
  default : console.log("Game has been updated");
   Game.merge(updatedGame, update).save();}

if else, если список работает так, как он должен, но оператор switch дает ошибки

1 ответ

Есть решение
Tieson T. Nina Scholz ответил: 13 июня 2018 в 05:49

Для лучшей читаемости вы можете опустить детали else, потому что исключенное исключение, которое не попадает внутрь функции, заканчивает функцию.

if (!updatedGame) {
    throw new NotFoundError("HTTP 404 Not Found: No Games Here");
}
if (update.color && !validColor(update.color)) {
    throw new BadRequestError("HTTP 400 Bad Request: No Such Color");
}
if (update.board !== undefined && moves(update.board, updatedGame.board) > 1) {
    throw new BadRequestError("HTTP 400 Bad Request:  Only one move allowed. Wait your turn");
}
console.log("Game has been updated");
return Game.merge(updatedGame, update).save();
Vivek ответил: 13 июня 2018 в 05:51
Как это улучшает читаемость? Пожалуйста, объясни. Код, указанный с if..else в вопросе, более читабельен, чем это.
Nina Scholz ответил: 13 июня 2018 в 05:54
это ранняя парадигма выхода с единственным if. после выхода по исключению или просто для оператора возврата ничего больше не происходит.
newDev ответил: 13 июня 2018 в 05:55
О, хорошо, это имеет смысл! Я как-то понял, что оператор переключения будет чище. Я думаю, что это не лучшая практика. Ваш код имеет больше смысла и выглядит намного чище! Благодаря!