【问题标题】:mapDispatchToProps with typescript is being difficult带有打字稿的 mapDispatchToProps 很困难
【发布时间】:2017-10-04 05:06:12
【问题描述】:

尝试使用 typescript 和 redux 构建一个简单的 react crud 应用程序并遇到以下问题。我有一个具有指定签名的函数,它将把一个人对象作为参数,如此处所示。

export default function savePerson(person: Person) {
    return async (dispatch: any) => {
        let newPerson = await axios.post('/api/people/addPeron', person);
        dispatch(addPersonSuccess(person));
    }
}

现在,当我尝试将组件连接到 redux 时,mapDispatchToProps 出现问题。这是我的代码。

function mapDispatchToProps(dispatch: any) {
  const actions = {
    savePerson: () => dispatch(savePerson())
  }
  return actions;
}

问题是 savePerson 函数需要一个人传递给它,但是我无法访问 mapDispatchToProps 中的状态,并且由于该函数缺少参数,我的代码无法编译。有什么想法吗?

使用解决方案编辑:

这是使该代码工作所需的一项更改的代码。

function mapDispatchToProps(dispatch: any) {
  const actions = {
    savePerson: (person: Person) => dispatch(savePerson(person))
  }
  return actions;
}

我只需要将 person 对象传递给调用 dispatch 的匿名函数。

【问题讨论】:

    标签: reactjs typescript redux


    【解决方案1】:
    import { AnyAction } from "redux";
    import { ThunkDispatch } from "redux-thunk";
    import { savePerson } from "../myActions";
    
    // IExtraDispatchArguments usually is empty
    import { IExtraDispatchArguments, IStoreState } from "../myGlobalTypes"
    
    interface IMyComponentProps {
        savePerson: (person: Person) => Promise<void>;
    }
    class MyComponent extends React.Component<IMyComponentProps, void>{
        someMethod(person: Person) {
            this.actions.savePerson(person);
        }
    }
    
    const WrappedComponent = connect(
       (state: IStoreState, ownProps: {}) => ({
           // here you can map state
       }),
       (dispatch: (dispatch: ThunkDispatch<IStoreState, IExtraDispatchArguments, AnyAction>)) => ({
          // savePerson: (person: Person) => dispatch(savePerson(person))
          actions: {
             savePerson: (person: Person) => dispatch(savePerson(person))
          }
       }
    );
    

    【讨论】:

    • 我从你的回答中得到的主要收获是,我没有将 person 对象传递给调用调度的匿名函数,一旦我这样做了,它就起作用了。现在接受这个答案。
    • 内容丰富,谢谢。我想知道dispatch 是否总是返回一个承诺。
    • 内容丰富,谢谢。我想知道dispatch 是否总是返回一个承诺。
    • 在我的例子中,将调度定义为Dispatch&lt;IStoreState&gt; 的类型会引发此异常:Property 'type' is missing in type 'IStoreState'。 (我正在使用反应 16.3.16)
    • @tudor,谢谢关注,我更新了答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多