使用打字稿创建我的应用程序时,遇到了一个小问题,我暂时还无法解决。
我的代码:
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
编辑和TL; DR: 只需使用以下命令升级类型声明
npm install --save-dev @types/react-router
这是声明文件中的错误。问题是最初预期的儿童类型是
((props: RouteComponentProps<any>) => React.ReactNode | React.ReactNode)
这实际上是一个函数,该函数返回一个合并为React.ReactNode | React.ReactNode简单的联合React.ReactNode。
React.ReactNode | React.ReactNode
React.ReactNode
它本来应该是
((props: RouteComponentProps<any>) => React.ReactNode) | React.ReactNode
我在这里为您提出了拉取请求。
我应该提到,您可能不想依赖此行为。几乎所有的例子我可以在网上找到使用明确的 属性 的children同时,通过与反应路由器的功能。甚至文档本身也说它只接受一个函数(而不是元素或其他任何东西)。
children