После проверки, если что-то не является нулевым, я получаю ошибку нулевого или неопределенного типа. Как? - PullRequest
0 голосов
/ 05 июня 2019

У меня есть довольно сложный массив элементов, который хранится в состоянии моего магазина редуксов.Это не так важно для вопроса.У меня есть этот фрагмент кода, который иногда ломается (1/30 оценки).Я пытался отладить эту проблему в течение нескольких дней.Вы можете игнорировать логику утверждения If, это не проблема.Проблема в том, что вторая часть оценки в заявлении обрывается.Тернарный оператор проверяет, является ли что-то не нулевым, затем выполняет отдельную проверку, в которой я получаю ошибку типа, что проверяемое мной значение равно нулю.Как это возможно?

Я пробовал консоль, регистрирующую эту проблему несколькими способами, и каждый результат предполагает, что значение существует.Я попытался переформатировать код, ожидая, что он может быть связан с браузером.Кажется, он более устойчив в браузере Google Chrome, чем в Microsoft.

 const indexLeft = state.Board[index].Left;
if (
!state.InitialPlay &&
   (
       state.Board[index].RoadTopRight !== null ? state.Board[index].RoadTopRight.Type._ !== player.Type._ : true ||
       state.Board[index].RoadRight !== null ? state.Board[index].RoadRight.Type._ !== player.Type._ : true ||
       state.Board[indexRight].RoadTopLeft !== null ? state.Board[indexRight].RoadTopLeft.Type._ !== player.Type._ : true
   )
) return state;

Ожидаемый фактический результат заключается в том, что значение, вычисляемое троичным оператором, будет отличаться от нуля.Это единственная проверка, необходимая, так как типы дорог получают только объявленных игроков, поэтому у него не может быть сценария, в котором тип дороги не будет иметь свойства Type.

Если вы заинтересованы в разгадке этой тайны и не возражаетеполный и полный беспорядок в моем коде, это рассматриваемый репозиторий github и модуль, о котором идет речь: https://github.com/AnteVuletic/Internship-17-React4/blob/master/src/redux/modules/board.js

Проблема может быть найдена в литерале функции _setCrossroad

1 Ответ

1 голос
/ 05 июня 2019

Полагаю, state.Board[index].RoadTopRight, state.Board[index].RoadRight и state.Board[indexRight].RoadTopLeft равны undefined

ваше состояние должно быть != или !{variable_name}

const indexLeft = state.Board[index].Left;
if(!state.InitialPlay &&
   (
       state.Board[index].RoadTopRight != null ? state.Board[index].RoadTopRight.Type._ !== player.Type._ : true ||
       state.Board[index].RoadRight != null ? state.Board[index].RoadRight.Type._ !== player.Type._ : true ||
       state.Board[indexRight].RoadTopLeft != null ? state.Board[indexRight].RoadTopLeft.Type._ !== player.Type._ : true
   )
) return state;

потому что undefined! == null всегда будет истинным

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...