gpt4 book ai didi

reactjs - 带有 TypeScript 的 React-router-dom

转载 作者:行者123 更新时间:2023-12-03 12:56:20 25 4
gpt4 key购买 nike

我正在尝试将 React 路由器与 TypeScript 结合使用。但是,我在使用 withRouter 函数时遇到了某些问题。在最后一行,我遇到了非常奇怪的错误:

Argument of type 'ComponentClass<{}>' is not assignable to parameter of type 'StatelessComponent<RouteComponentProps<any>> | ComponentClass<RouteComponentProps<any>>'.
Type 'ComponentClass<{}>' is not assignable to type 'ComponentClass<RouteComponentProps<any>>'.
Type '{}' is not assignable to type 'RouteComponentProps<any>'.
Property 'match' is missing in type '{}’

代码如下:

import * as React from 'react';
import { connect } from 'react-redux';
import { RouteComponentProps, withRouter } from 'react-router-dom';

interface HomeProps extends RouteComponentProps<any> {
}

interface HomeState { }

class Home extends React.Component<HomeProps, HomeState> {
constructor(props: HomeProps) {
super(props);
}
public render(): JSX.Element {
return (<span>Home</span>);
}
}

const connectModule = connect(
(state) => ({
// Map state to props
}),
{
// Map dispatch to props
})(Home);

export default withRouter(connectModule);

最佳答案

我使用不同的方法来解决这个问题。我总是将不同的属性(路由器、常规和调度)分开,因此我为我的组件定义了以下接口(interface):

interface HomeRouterProps {
title: string; // This one is coming from the router
}

interface HomeProps extends RouteComponentProps<HomeRouterProps> {
// Add your regular properties here
}

interface HomeDispatchProps {
// Add your dispatcher properties here
}

您现在可以创建一个新类型,将所有属性组合到一个类型中,但我总是在组件定义期间组合这些类型(我不在这里添加状态,但如果您需要一个,请继续)。组件定义如下所示:

class Home extends React.Component<HomeProps & HomeDispatchProps> {
constructor(props: HomeProps & HomeDispatchProps) {
super(props);
}

public render() {
return (<span>{this.props.match.params.title}</span>);
}
}

现在我们需要通过容器将组件连接到状态。它看起来像这样:

function mapStateToProps(state, ownProps: HomeProps): HomeProps => {
// Map state to props (add the properties after the spread)
return { ...ownProps };
}

function mapDispatchToProps(dispatch): HomeDispatchProps {
// Map dispatch to props
return {};
}

export default connect(mapStateToProps, mapDispatchToProps)(Hello);

此方法允许完全类型化连接,因此组件和容器是完全类型化的,并且重构它是安全的。重构时唯一不安全的是路由中映射到 HomeRouterProps 接口(interface)的参数。

关于reactjs - 带有 TypeScript 的 React-router-dom,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44118060/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com