小编典典

反应路由器+打字稿类型错误

reactjs

使用打字稿创建我的应用程序时,遇到了一个小问题,我暂时还无法解决。

我的代码:

App.tsx

import  * as React from 'react';
import * as ReactDOM from 'react-dom';
import { Provider } from 'react-redux';
import { createStore, applyMiddleware } from 'redux';
import { BrowserRouter, Route, Switch } from 'react-router-dom';
import * as promise from 'redux-promise';
import reducers from './reducers';
import TemplateNavTop from './components/layout/template-nav-top';
const TestComponent2 = () => {
  return <h1>TestComponent</h1>;
}

const createStoreWithMiddleware = applyMiddleware(promise)(createStore);

ReactDOM.render(
<Provider store={createStoreWithMiddleware(reducers)}>
    <BrowserRouter>
        <Switch>
            <Route path="/" exact component={TestComponent} />
            <Route path="/checkout">
                <TemplateNavTop>
                    <TestComponent2 />
                </TemplateNavTop>
            </Route>
        </Switch>
    </BrowserRouter>
</Provider>
, document.getElementById('root')

模板导航顶部

import * as React from 'react';
import NavTop from './nav-top/nav-top';
export default class TemplateNavTop extends React.Component<any, {}> {
  render() {
    return (
        <div>
            asd
            {this.props.children}
            Footer
        </div>
    );
  }
}

该问题出现在/ checkout路由中,其中抱怨以下内容:

Type '{ path: "/checkout"; children: Element; }' is not assignable to type 'IntrinsicAttributes & IntrinsicClassAttributes<Route> & Readonly<{ children?: ReactNode; }> & Rea...'.
  Type '{ path: "/checkout"; children: Element; }' is not assignable to type 'Readonly<RouteProps>'.
    Types of property 'children' are incompatible.
      Type 'Element' is not assignable to type '(props: RouteComponentProps<any>) => ReactNode'.

我发现以下变通办法确实有效:

<Route path="/checkout" component={() => TemplateWithNavBar(<TestComponent2 />)} />

但是我宁愿以正确的方式来做,这里有人能够帮助我吗?

编辑:我确实安装了@types


阅读 223

收藏
2020-07-22

共1个答案

小编典典

编辑和TL; DR: 只需使用以下命令升级类型声明

npm install --save-dev @types/react-router

说明

这是声明文件中的错误。问题是最初预期的儿童类型是

((props: RouteComponentProps<any>) => React.ReactNode | React.ReactNode)

这实际上是一个函数,该函数返回一个合并为React.ReactNode | React.ReactNode简单的联合React.ReactNode

它本来应该是

((props: RouteComponentProps<any>) => React.ReactNode) | React.ReactNode

我在这里为您提出了拉取请求

我应该提到,您可能不想依赖此行为。几乎所有的例子我可以在网上找到使用明确的 属性
children同时,通过与反应路由器的功能。甚至文档本身也说它只接受一个函数(而不是元素或其他任何东西)。

2020-07-22