【问题标题】:Cannot read properties of undefined (reading 'type'). Redux无法读取未定义的属性(读取 \'type\')。还原
【发布时间】:2022-08-18 20:42:46
【问题描述】:

所以,我正在尝试在我的项目中设置 redux。在 reducer 中出现了一个非常奇怪的问题:Uncaught TypeError: Cannot read properties of undefined (reading \'type\')。 这是reducer.ts:

import { MarkerActionEnum, MarkerActions, MarkerState } from \'./types\';

const initialState: MarkerState = {
  data: undefined,
};

export function MarkerReducer(
  action: MarkerActions,
  state = initialState,
): MarkerState {
  switch (action.type) {
    case MarkerActionEnum.ADD_MARKER:
      return {
        ...state,
        data: action.payload,
      };
    case MarkerActionEnum.DELETE_MARKER: {
      return { data: undefined };
    }
    default:
      return state;
  }
}

export default MarkerReducer;

和 types.ts 用于减速器:

import { Action } from \'redux\';
import { MarkerType } from \'../../pages/mapPage/components/CustomMap\';

export interface MarkerState {
  data: MarkerType | undefined;
}

export enum MarkerActionEnum {
  ADD_MARKER = \'marker/ADD_MARKER\',
  DELETE_MARKER = \'marker/DELETE_MARKER\',
}

export interface AddMarkerInterface
  extends Action<MarkerActionEnum.ADD_MARKER> {
  type: MarkerActionEnum.ADD_MARKER;
  payload: { longitude: number; latitude: number };
}

export interface DeleteMarkerInterface
  extends Action<MarkerActionEnum.DELETE_MARKER> {
  type: MarkerActionEnum.DELETE_MARKER;
}

export type MarkerActions = AddMarkerInterface | DeleteMarkerInterface;

日志说问题出现在reducer的第11行,就在switch (action.type) 有没有人知道或偶然发现这样的事情?

  • 附带说明:看起来您可能正在为 Redux+React-Redux 使用一些遗留样式的模式。带有 Redux Toolkit 和 React-Redux 钩子 API 的“现代 Redux” 应该有助于简化代码并更易于使用,尤其如果您使用的是 TS。 (例如,整个单独的“reducer types”文件将完全消失!)有关详细信息,请参阅我们的 Redux 文档教程:redux-toolkit.js.org/tutorials/overviewredux.js.org/usage/…

标签: reactjs typescript redux react-redux


【解决方案1】:

我想说这意味着您使用了作为 dispatch 的参数而不是动作的东西,即没有 type 属性。例如,如果您有一个操作构建器并且忘记了括号,例如在dispatch(myActionBuilder) 而不是dispatch(myActionBuilder())

【讨论】:

  • 但它仍然应该返回默认状态不是吗?
  • 不,因为它在switch (action.type) 处抛出错误,所以它永远不会到达返回语句。在此之前只需console.log(action),您就会明白问题出在哪里。
【解决方案2】:

我遇到过同样的问题。问题是参数的顺序。 “状态”应该是第一位的,“行动”应该是第二位的。

【讨论】:

    猜你喜欢
    • 2022-07-15
    • 2023-01-07
    • 1970-01-01
    • 2020-05-13
    • 2015-07-01
    • 2021-08-01
    • 2021-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多