Я обнаружил ошибку при связывании моего компонента с магазином.
TypeError: Невозможно прочитать свойство 'errorMessage' из неопределенного
Function.mapStateToProps [as mapToProps]
37 | const mapStateToProps = (state: AppState) => ({
> 38 | errorMessage: state.errorRedux.errorMessage,
39 | error: state.errorRedux.error,
40 | })
Я не могу понять, в чем проблема. Не следует прислушиваться к ошибке, поскольку я решил сделать сообщение условно.
- Я попытался установить
errorMessage: string | undefined | null
безуспешно.
- Я пытался
errorMessage: "[INTERFACE"]
безуспешно.
- Я пытался
errorMessage?: string
Я думаю, что проблема может заключаться в расширении интерфейса ErrorHandlerProps, но я уже расширил mapStateToProps?
import { Dispatch, Action } from "redux"
import { connect } from "react-redux"
import { AppState } from "reducers"
import { showError } from "data/error_handler"
class ErrorHandler extends React.Component<
ReturnType<typeof mapStateToProps> & ReturnType<typeof mapDispatchToProps>
> {
public render() {
const { onShowError, error, errorMessage } = this.props
let showTheError =
this.props.error === true ? (
<Snackbar
open={error}
message={errorMessage}
autoHideDuration={5000}
/>
) : null
return (
<div>
<RaisedButton onClick={onShowError} label="Toggle ErrorHandler" />
{showTheError}
</div>
)
}
}
const mapStateToProps = (state: AppState) => ({
errorMessage: state.errorRedux.errorMessage,
error: state.errorRedux.error,
})
const mapDispatchToProps = (dispatch: Dispatch<Action>) => {
return {
onShowError: () => dispatch(showError()),
}
}
export default connect(
mapStateToProps,
mapDispatchToProps
)(ErrorHandler)
data/interfaces.ts
export interface ErrorHandlerProps {
error: boolean
errorMessage: string
}
data/reducer.ts
import { ErrorHandlerProps, ActionTypes } from "./"
const initialState: ErrorHandlerProps = {
error: false,
errorMessage: "",
}
export default (
state: ErrorHandlerProps = initialState,
action: ActionTypes
) => {
switch (action.type) {
case "SHOW_ERROR":
return {
...state,
}
default:
return state
}
}
reducers.ts
import { reducer as errorHandler, ErrorHandlerProps } from "data/error_handler"
const appReducer = combineReducers({
errorHandler
} as any)
export type AppState = {
errorRedux: ErrorHandlerProps
}
store.ts
import { createStore, applyMiddleware, compose } from "redux"
import { routerMiddleware } from "react-router-redux"
import thunk from "redux-thunk"
import rootReducer, { AppState } from "reducers"
const initialState = {}
const middleware = [thunk, routerMiddleware(history)]
const composedEnhancers = compose(applyMiddleware(...middleware), ...enhancers)
const store = createStore(rootReducer, initialState, composedEnhancers)
export default store
export const getState = () => store.getState() as AppState