type, we can invert the params so that each reducer is a pure function accepting state and an action. (Maybe even simpler)... We could standardize actions and pass in only state and a payload.
actually a function rather than the expected object. 2. Thunk middleware checks every action to see if it is a function. 3. If so, the middleware calls the function and passes in access to some store methods: dispatch and getState. 1. Just async/await
reducer and changes state. 1. Effect action: triggers an async action. This might call a Reducer action, but async functions do not directly change any state.
is a redundant side effect of the separation of action creators and reducers. Treat the two as one, and there is no more need for large files of exported type strings.