我刚开始学习mind类型,我需要一些帮助来理解我头脑中不清楚的两件事。
bindActionCreators的验证就会失败(我正在使用redux-thunk)。在使用redux-thunk时,如何继续使用流和绑定异步操作创建者?
代码示例(https://gist.github.com/momsse/323c228e8c5e264067039b8446cd890f):
import { bindActionCreators } from 'redux';
import type { Dispatch } from 'redux';
type Action = { type: 'SET_PROFILE', profile: Object };
/**
* Based on https://github.com/gaearon/redux-thunk/blob/master/index.d.ts
*/
type ThunkAction = (dispatch: Dispatch<Action>,
getState: () => any,
extraArgument: any) => any;
type Profile = {
name: string,
team: string
}
// Async actions creator
function setProfile(profile: Profile): ThunkAction {
return dispatch => setTimeout(() => dispatch({ type: 'SET_PROFILE', profile }), 2000);
}
const profileActionCreators = { setProfile };
type Props = {
actions: {
setProfile: (profile: Profile) => ThunkAction,
}
}
function mapDispatchToProps(dispatch: Dispatch<Action>): Props {
return {
actions: bindActionCreators(profileActionCreators, dispatch)
};
}错误:
40: actions: bindActionCreators(profileActionCreators, dispatch)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ function call. Function cannot be called on any member of intersection type
40: actions: bindActionCreators(profileActionCreators, dispatch)
^^^^^^^^^^^^^^^^^^ intersection
Member 1:
49: declare function bindActionCreators<A, C: ActionCreator<A, any>>(actionCreator: C, dispatch: Dispatch<A>): C;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ polymorphic type: function type. See lib: flow-typed/npm/redux_v3.x.x.js:49
Error:
49: declare function bindActionCreators<A, C: ActionCreator<A, any>>(actionCreator: C, dispatch: Dispatch<A>): C;
^^^^^^^^^^^^^^^^^^^^^ function type. Callable signature not found in. See lib: flow-typed/npm/redux_v3.x.x.js:49
40: actions: bindActionCreators(profileActionCreators, dispatch)
^^^^^^^^^^^^^^^^^^^^^ object literal
Member 2:
50: declare function bindActionCreators<A, K, C: ActionCreators<K, A>>(actionCreators: C, dispatch: Dispatch<A>): C;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ polymorphic type: function type. See lib: flow-typed/npm/redux_v3.x.x.js:50
Error:
13: declare type Dispatch<A: { type: $Subtype<string> }> = (action: A) => A;
^^^^^^^^^^^^^^^^^^^^^^^^^^ property `type` of object type. Property not found in. See lib: flow-typed/npm/redux_v3.x.x.js:13
21: function setProfile(profile: Profile): ThunkAction {
^^^^^^^^^^^ function type发布于 2017-03-14 15:31:27
以下是ActionCreator和bindActionCreators的完整声明:
declare type ActionCreator<A, B> = (...args: Array<B>) => A;
declare type ActionCreators<K, A> = { [key: K]: ActionCreator<A, any> };
declare function bindActionCreators<A, C: ActionCreator<A, any>>(actionCreator: C, dispatch: Dispatch<A>): C;
declare function bindActionCreators<A, K, C: ActionCreators<K, A>>(actionCreators: C, dispatch: Dispatch<A>): C;在您的代码中,bindActionCreators将profileActionCreators的每个属性包装在dispatch中。您似乎希望将分派传递给setProfile函数,在该函数中,分派稍后可用作回调。
但在我看来,bindActionCreators似乎不支持作为回调的“绑定”调度。更确切地说,调度是这样的“绑定”:
function bindActionCreator(actionCreator, dispatch) {
return (...args) => dispatch(actionCreator(...args))
}所以在您的代码中,它实际上如下所示:
function mapDispatchToProps(dispatch: Dispatch<Action>): Props {
return {
actions: {
setProfile: (profile) => dispatch(dispatch => setTimeout(() => dispatch({ type: 'SET_PROFILE', profile }), 2000)),
};
}因此,each类型正确地捕获了类型错误,表示bindActionCreators希望对象的每个属性都是actionCreator:() => Action。
您可能不能在用例中使用bindActionCreators,或者您需要重新考虑如何处理块。下面是一种应该有效的方法。
const profileActionCreators = { setProfile };
type Props = {
actions: {
setProfile: (profile: Profile) => setTimeout,
}
}
function mapDispatchToProps(dispatch: Dispatch<Action>): Props {
const boundActions = bindActionCreators(
profileActionCreators,
dispatch
);
return ({
actions: {
setProfile: (profile: Profile) => setTimeout(() => boundActions.setProfile(profile), 2000),
},
});
}雷击法
如果您想保持ThunkAction方法,您将无法使用bindActionCreators。这也很管用。
https://stackoverflow.com/questions/40620636
复制相似问题