【问题标题】:Typescript throws error when accessing payload in reducerTypescript 在 reducer 中访问有效负载时抛出错误
【发布时间】:2020-05-14 21:06:41
【问题描述】:

我有一个减速器,如果我尝试在 秒内访问 payload 中的 formError 属性,Typescript 会引发错误开关盒

import actionTypes, { ActionCreatorType, ReducerType } from './types';

const initialState: ReducerType = {
  formError: '',
  responseSubmitted: false,
};

const enquiryFormReducer = (state = initialState, action: ActionCreatorType): ReducerType => {
  const { type, payload, } = action;

  switch (type) {
    case actionTypes.SUBMIT_FORM_SUCCESS:
      return {
        ...state,
        responseSubmitted: true,
        formError: '',
      };

    case actionTypes.SUBMIT_FORM_FAILURE:
      return {
        ...state,
        responseSubmitted: false,
        formError: payload.formError,
      };

    default:
      return state;
  }
};

export default enquiryFormReducer;

这是我的类型文件。

const actionTypes = {
  SUBMIT_FORM_SUCCESS: 'SUBMIT_FORM_SUCCESS',
  SUBMIT_FORM_FAILURE: 'SUBMIT_FORM_FAILURE',
} as const;

interface FormErrorType {
  formError: string;
}

export interface SuccessActionType {
  type: typeof actionTypes.SUBMIT_FORM_SUCCESS;
  payload: {};
}

export interface FailureActionType {
  type: typeof actionTypes.SUBMIT_FORM_FAILURE;
  payload: FormErrorType;
}

export interface ReducerType {
  responseSubmitted: boolean;
  formError: string;
}

export type ActionCreatorType = | SuccessActionType | FailureActionType;

export default actionTypes;

您可以看到 actionCreatorTypes 是根据 switch case 可能的所有操作的联合。但是 Typescript 抛出以下错误:

Property 'formError' does not exist on type '{} | FormErrorType'.
Property 'formError' does not exist on type '{}'

我该如何解决这个问题?

【问题讨论】:

    标签: reactjs typescript redux react-redux reducers


    【解决方案1】:

    问题在于解构。当您这样做时,type 将停止与payload 相关,并且不再用作联合判别式。请直接使用action.typeaction.payload

    switch (action.type) { // direct use
        case actionTypes.SUBMIT_FORM_FAILURE:
          return {
            ...state,
            responseSubmitted: false,
            formError: action.payload.formError, // direct use
          };
        ...
    
    

    【讨论】:

    • 嗨,Maciej,我试过formError: action.payload.formError,但效果不佳。
    • 你在switch(action.type)action.payload.formError里面做过吗?
    • 在答案中添加额外的 sn-p
    • 嘿 Maciej,我忘记将 switch(type) 更改为 switch(action.type),现在它可以正常工作了。如果您能深入解释一下为什么解构会导致问题,那就太好了,因为我无法理解:) 再次感谢!
    猜你喜欢
    • 1970-01-01
    • 2018-06-11
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 2018-02-22
    • 2016-11-20
    • 2018-02-14
    • 1970-01-01
    相关资源
    最近更新 更多