【发布时间】:2020-10-31 04:01:35
【问题描述】:
我有以下堆栈:
react@16.13.1
react-dom@16.13.1
react-redux@7.2.0
react-router-dom@5.2.0
我按照this answer 中建议的方法对使用withRouter 创建的HOC 组件进行类型检查,并且工作正常。例如。以下组件类型检查:
import React from "react";
import { withRouter } from "react-router-dom";
import { RouteComponentProps } from "react-router-dom";
type Props = RouteComponentProps<any>;
class Test extends React.Component<Props, {}> {
componentDidMount = () => {
this.props.history.push("foo");
};
render() {
return <div>foo</div>;
}
}
export default withRouter(Test);
当我还希望使用connect 将组件链接到 Redux 存储时,就会出现问题。以下代码无法进行类型检查:
import React from "react";
import { connect, ConnectedProps } from "react-redux";
import { withRouter } from "react-router-dom";
import { RouteComponentProps } from "react-router-dom";
type RootState = { foo: number };
const mapStateToProps = (state: RootState) => {
foo: state.foo;
};
const connector = connect(mapStateToProps, null);
type PropsFromRedux = ConnectedProps<typeof connector>;
type Props = PropsFromRedux & RouteComponentProps<any>;
class Test extends React.Component<Props, {}> {
componentDidMount = () => {
this.props.history.push("foo"); // TS2339: Property 'history' does not exist on type 'never'.
};
render() {
return <div>foo</div>;
}
}
export default withRouter(connector(Test));
具体来说,我得到:
TS2339: Property 'history' does not exist on type 'never'.
两个问题:
- 为什么
props的类型被评估为never? - 如何正确检查使用
withRouter和connect连续应用创建的HOC 组件?
【问题讨论】:
-
PropsFromRedux和RouteComponentProps都没有提到history? -
@user0101 如果是这种情况,那么第一个代码清单也不会进行类型检查。因此,
RouteComponentProps确实声明了history。但不知何故,当RouteComponentProps类型与ConnectedProps的输出相结合时,我们就会遇到我无法解释的类型检查问题。
标签: reactjs typescript react-redux react-router react-router-v4