【发布时间】:2019-06-06 22:17:06
【问题描述】:
我正在尝试将 Redux 状态存储与 TypeScript 结合使用。我正在尝试使用 Redux 的官方 Typings 并希望对 connect 方法(将 mapStatetoProps 和 mapDispatchToProps 与组件连接)类型安全进行整个调用。
我经常看到 mapStatetoProps 和 mapDispatchToProps 方法只是自定义类型并返回部分组件道具的方法,例如:
function mapStateToProps(state: IStateStore, ownProps: Partial<IComponentProps>)
: Partial<IProjectEditorProps> {}
function mapDispatchToProps (dispatch: Dispatch, ownProps: Partial<IComponentProps>)
: Partial<IProjectEditorProps> {}
这是有类型的并且可以工作,但不是很安全,因为它可能会实例化一个缺少道具的组件,因为 Partial 接口的使用允许不完整的定义。但是,这里需要 Partial 接口,因为您可能希望在 mapStateToProps 中定义一些道具,在 mapDispatchToProps 中定义一些道具,而不是全部在一个函数中。所以这就是我想避免这种风格的原因。
我目前尝试使用的是直接将函数嵌入到 connect 调用中,并使用 redux 提供的通用类型键入 connect 调用:
connect<IComponentProps, any, any, IStateStore>(
(state, ownProps) => ({
/* some props supplied by redux state */
}),
dispatch => ({
/* some more props supplied by dispatch calls */
})
)(Component);
但是,这也会引发嵌入的mapStatetoProps 和mapDispatchToProps 调用未定义 all Props each 的错误,因为它们都只需要它们的一个子集,但是一起定义所有的 Props。
如何正确键入 connect 调用,以便 mapStatetoProps 和 mapDispatchToProps 调用是真正类型安全的,并且键入检查两种方法定义的组合值是否提供所有必需的道具,而没有定义所有必需的方法之一一次性道具?我的方法有可能吗?
【问题讨论】:
标签: reactjs typescript redux connect