Как различать и отличать action в Redux?
Что проверяют
Понимаете ли вы, что action в Redux это обычный объект, а различает их одно поле type, и как это устроено в современном Redux Toolkit. Следом обычно спрашивают, как обработать в одном слайсе action из другого и как типизировать это в TypeScript.
Как отвечать
Базовая механика: каждый задиспатченный action проходит через корневой reducer, и каждый слайс смотрит на action.type. В Redux 5 type обязан быть строкой, иначе dispatch бросит ошибку. Остальные поля по соглашению Flux Standard Action: payload, error, meta.
Дальше покажите, как это выглядит сейчас, в Redux Toolkit:
createSlice: генерирует action creators с типом вида"todos/added", префикс берётся изnameслайса, поэтому одинаковые имена в разных слайсах не пересекаются;createAction: у созданного creator есть поле.typeи метод.match(action), который работает как type guard в TypeScript;createAsyncThunk: сам thunk это функция, а не action, но по ходу работы он диспатчит три настоящих action с суффиксамиpending,fulfilled,rejected;- matchers:
isAnyOf,isPending,isRejectedвbuilder.addMatcherловят целую группу, например все ошибки загрузки разом.
Чужой action обрабатывают в extraReducers через builder.addCase(userLoggedOut, ...): так слайс корзины очищается при выходе, ничего не зная о слайсе авторизации.
Про именование: руководство по стилю Redux советует называть action как событие («заказ оформлен»), а не как сеттер («установить поле»). Тогда в Redux DevTools по логу видно, что происходило в приложении, а не какие поля менялись.
Где спотыкаются
Путают thunk с action и говорят, что «асинхронный action» попадает в reducer. Функцию перехватывает middleware, в reducer приходят только объекты.
Сравнивают строки руками: action.type === "FETCH_SUCCES" с опечаткой молча не сработает никогда. Надёжнее брать .type у creator или вызывать .match().
Заводят по сеттеру на каждое поле: setLoading, setData, setError. Одно событие превращается в три диспатча, логика размазывается по компонентам, а по логу уже не понять, что случилось.