为redux-thunk获取正确的调度类型

时间:2017-09-23 18:51:52

标签: typescript redux redux-thunk

我真的希望能够使用typescript完全输入,而不必重新实现具有潜在冲突签名的类型。

在这种情况下,我想使用来自loadUserList的调用/返回签名,并且仍然可以将它用于调度和连接。

loadUserList是一个redux-thunk函数,因此一旦它通过中间件,它最终会返回一个字符串。但是,我需要发送到DispatchProps的原型与我发送给CDispatchProps的原型(发送到连接函数的道具)不同。

虽然我可以将CDispatchProps更改为any,但实际上无法解决我的主要目标,即从userList.tsx导入类型签名,以便参数和返回有类型安全(我愿意放弃连接 - 因为它在"黑盒"类别中)。

也许最好的路线是一些打字法术,它将从ThunkAction< ...>中提取参数类型和返回类型。以合理的方式。

UserListPage.tsx

import { loadUserList, UserQuery } from "../store/actions/userList";

type DispatchProps = {
  loadUserList: (query: UserQuery) => string,
};

type CDispatchProps = {
  loadUserList: typeof loadUserList,
};

class UserListPage extends React.Component<Props & DispatchProps, State> {
  componentWillMount() {
    this.setState({ id: this.props.loadUserList(this.state.query) });
  }
}

export default connect<any, CDispatchProps, Props>((store: Store) => ({
  users: store.userList.entities,
  loading: store.userList.fetchStatus,
}), { loadUserList })(UserListPage);

userList.ts

export function loadPrivateUserList(options: UserQuery, force?: boolean): ThunkAction<string, State, null> {
  return (dispatch: redux.Dispatch<State>, getState: () => State): string => {
    const { userList } = getState();
    const id = computeID(options);

    // Do some async actions

    return id;
  }
}

0 个答案:

没有答案