BrowserRouter与typescript做出反应

时间:2017-07-19 07:06:22

标签: reactjs typescript

我在Reactjs +类型脚本中有简单的应用程序。 我试图使用react-router-dom中的BrowserRouter。

这是我的代码:

import * as React from "react"

import { Popular } from "./popular"

import { BrowserRouter as Router, Route } from "react-router-dom"

export interface AppProp {

}

export interface AppState {

}
export class App extends React.Component<AppProp , AppState > {

    render() {
        return (

            <div className='container'>
                <Router>
                    <Route path='/popular' component={Popular} />
                </Router>
            </div>
        )
    }
}

export default App

我发现了以下错误:

[at-loader]中的错误./node_modules/@types/react-router-dom/index.d.ts:55:25     TS2314:通用类型&#39;组件&#39;需要2个类型的参数。

[at-loader]中的错误./src/components/app.tsx:25:18     TS2604:JSX元素类型&#39;路由器&#39;没有任何构造或呼叫签名。

我在谷歌搜索但没有任何帮助。

有人有想法吗?

BR Nadav

2 个答案:

答案 0 :(得分:0)

似乎是打字问题,

如果您使用的是TypeScript 2.4.1,请确保使用的是@types的那些版本。

"@types/react": "15.0.35",
"@types/react-dom": "15.5.1",

答案 1 :(得分:0)

我能够使用带有Typescript的BrowserRouter,并且能够将历史道具和redux道具/ thunk传递给组件。关键是在应用程序级别使用“ withRouter”。我还必须将r​​ender属性与“ Route”一起使用才能放下道具。现在,我可以在我的组件以及道具和thunk中使用“ this.props.history.push(“ / url1”)“和” this.props.history.replace(“ / url2”)“。也是传播符号的岩石。

import { RouteComponentProps, withRouter,
         Switch, Route, Redirect } from 'react-router-dom'

interface AppProps {
  children?: any
  myAppStore: any
  myAppActions: any
};

class App extends React.Component<RouteComponentProps<{}> & AppProps>
{
  constructor(props: RouteComponentProps<{}> & AppProps) {
  super(props);
 }

render() {
  return (
    <div className="App">
      <AppNavBar {...this.props}/>
      <Switch>

        // This component gets both Router props and my props
        <Route path="/c1" default={true} exact={true} render={()=>{return( 
           <MyComponentOne {...this.props}/>)} } />

        // This component only gets Router props
        <Route path="/c2" {...this.props} exact={true} component={MyComponentTwo } />

        </Switch>
        <Redirect from="/" to="/c1"/>
      </div>
    );
  }
}

... Do redux stuff ..
// ApplicationProps and ApplicationActions are mapped redux props and thunks.

const connector = connect(ApplicationProps,ApplicationActions);
export default connector<any>(withRouter(App));

这是我的index.tsx渲染

  <Provider store={MyStore}>
  <BrowserRouter basename="/">
  <App/>
  </BrowserRouter>
  </Provider>