Это правильно?
Мутация item
находится внутри случая "favorite"
, на самом деле, подозрительно, как указывал @Tholle.Мутация в редукторах обычно считается анти-паттерном и часто может привести к ошибкам.Я бы определенно рекомендовал изменить его на неизменный шаблон.
Но тогда ...
Почему это не вызывает ошибку, если предположить, что она неверна?
Изменчивость в редукторах является распространенным источником ошибок, но то, вызывает ли конкретный бит мутации ошибку, зависит от того, как он мутировал и как используется редуктор.
Хотя случай с фаворитами может неправильно использоваться повторно item
объектов из одной версии состояния в другую, он всегда создает новый массив состояний, так как Array.prototype.map
всегда возвращает новый массив.Так, например, useReducer
, который заботится только об идентичности объекта внешнего состояния, корректно вызовет повторную визуализацию, несмотря на мутацию.
С другой стороны, селектор редукса, запомненный для определенного элемента в массиве, будет неправильно возвращать старые значения.И если старые items
кэшируются и используются повторно, мутация может также вызвать неожиданные ошибки.Но это довольно специфические случаи, поэтому я подозреваю, что в большинстве случаев это сработает.(Я все же изменил бы это, чтобы не изменять, хотя)
Любые инструменты, которые помогли бы мне проверить правильность обновлений состояния?
Что вы хотите, это некоторая форма неизменности: в JS есть несколько библиотек для неизменности.
- ImmutableJS определяет свои собственные структуры данных со своими собственными API
- seamless-immutable определяет неизменяемые структуры данных, которые выглядят как обычные изменяемыеиз них
- immer позволяет выполнять неизменяемые операции с обычным синтаксисом изменяемой операции.
Также Typescript можно использовать по отдельности или в сочетании с этими библиотеками:объекты и массивы должны быть объявлены как только для чтения, и выдает ошибки компилятора, если вы изменяете их.
Также может помочь правило линтера, но оно будет сложным, если вы не согласны с запретом всех мутаций во всей кодовой базе или же вручную включите правило на внутренних редукторах.