我正在创建一个使用redux和typescript作为语言的react应用程序。我听从了这个post的建议,为mapStateToProps
和maptDispatchToProps
函数创建类型。这是我的容器:
import { connect } from 'react-redux'
import { AppState } from 'src/store';
import { changeFilter } from 'src/store/tasks/actions';
import { Dispatch } from 'redux';
import { VisibilityFilter } from 'src/store/tasks/types';
import * as React from 'react';
interface OwnProps {
filter: VisibilityFilter;
}
interface StateProps {
active: boolean
}
interface DispatchProps {
onClick: () => void
}
type Props = StateProps & DispatchProps & OwnProps
export const Filter: React.FC<Props> = props => {
const { active, onClick, children } = props;
return (
<button
onClick={onClick}
disabled={active}
style={{
marginLeft: "4px"
}}
>
{children}
</button>
);
};
const mapStateToProps = (state: AppState, ownProps: OwnProps): StateProps => ({
active: ownProps.filter === state.tasksState.visibilityFilter
})
const mapDispatchToProps = (dispatch: Dispatch<any>, ownProps:OwnProps): DispatchProps => ({
onClick: () => dispatch(changeFilter(ownProps.filter))
})
export default connect<StateProps,DispatchProps,OwnProps>(
mapStateToProps,
mapDispatchToProps
)(Filter)
但是对于mapDispatchToProps
函数,我在connect
函数中遇到了以下错误:
类型为‘(DispatchProps:DispatchProps,ownProps: OwnProps)
DispatchProps’的调度参数不能赋给类型为'DispatchProps‘的参数。类型“(Dispatch: Dispatch,ownProps: OwnProps) => DispatchProps”中缺少属性“”DispatchProps“”,但类型“”DispatchProps“”中需要属性“”DispatchProps“”。.ts(2345) Filter.tsx(17,5):此处声明了“”onClick“”。“Filter.tsx(49,5):你的意思是调用这个表达式吗?
我的DispatchProps
类型是否有问题,被connect
函数拒绝了?
如果您需要知道这些是我正在使用的库:
"dependencies": {
"react": "^16.8.6",
"react-dom": "^16.8.6",
"react-redux": "^7.0.2",
"react-scripts-ts": "3.1.0",
"redux": "^4.0.1"
},
"devDependencies": {
"@types/jest": "^24.0.11",
"@types/node": "^11.13.4",
"@types/react": "^16.8.13",
"@types/react-dom": "^16.8.4",
"@types/react-redux": "^7.0.6",
"typescript": "^3.4.3"
}
更新
如果我删除connect
函数中的泛型类型,那么错误就会在这里消失,它会推断出类型:
但是现在,当我使用Filter
时,容器迫使我在定义中添加onclick属性:
发布于 2019-04-16 11:19:17
我在这个post中找到了解决方案。有一个为泛型Dispatch
定义的名为AnyAction
的类型,它是redux库的一部分,因此mapDispatchToProps
应该是:
const mapDispatchToProps = (dispatch: Dispatch<AnyAction>, ownProps:OwnProps): DispatchProps => ({
onClick: () => dispatch(changeFilter(ownProps.filter))
})
发布于 2019-04-16 03:32:37
而不是
const mapDispatchToProps = (dispatch: Dispatch<any>, ownProps:OwnProps): DispatchProps => ({
onClick: () => dispatch(changeFilter(ownProps.filter))
})
执行此操作
//in the import section
import { bindActionCreators } from "redux";
const mapDispatchToProps = (dispatch: Dispatch<any>, ownProps:OwnProps): DispatchProps => {
return bindActionCreators ({
changeFilter }),
dispatch
}
本例中的mapDispatchToProps
返回一个包含onClick函数的对象,这不是它的预期行为
https://stackoverflow.com/questions/55695977
复制相似问题