2017-07-02 860 views
3

我将javascript代码替换为typescript。但是,失败的建设。
- JSX element type 'Router' does not have any construct or call signatures.
- JSX element type 'Switch' does not have any construct or call signatures.
- JSX element type 'Route' does not have any construct or call signatures.JSX元素类型“路由”没有任何构造或呼叫签名

如何解决这个问题?

错误代码

import * as React from 'react'; 
import * as ReactDOM from 'react-dom'; 
import { Router, Switch, Route } from 'react-router'; 
import { Provider } from 'react-redux'; 
import createBrowserHistory from 'history/createBrowserHistory'; 

import Counter from './containers/Container'; 
import store from './stores/store'; 
import NotFound from './components/NotFound'; 


const history = createBrowserHistory(); 

ReactDOM.render(
    <Provider store={store}> 
    <Router history={history}> 
     <Switch> 
     <Route exact path="/counter" component={Counter} /> 
     <Route path="/counter/:id" component={Counter} /> 
     <Route component={NotFound}/> 
     </Switch> 
    </Router> 
    </Provider> 
    , document.getElementById('app') 
); 

和同样的错误,当我用import { Route } from 'react-router-dom';发生。

+0

这是什么版本的反应路由器? – Li357

+0

“react-router”:“^ 4.1.1”, “@ types/react-router”:“^ 4.0.12”, – hohihohi

回答

0

好吧,首先你必须安装react-router-dom,如here所述。然后做这样的事情,

import { BrowserRouter, Route, Switch } from 'react-router-dom'; 

import Counter from './containers/Container'; 
import store from './stores/store'; 
import NotFound from './components/NotFound'; 

    ReactDOM.render(
     <Provider store={store}> 
     <BrowserRouter> 
      <div> 
      <Switch> 
       <Route path="/counter" component={Counter} /> 
       <Route path="/invalid/path" component={NotFound} /> 
      </Switch> 
      </div> 
     </BrowserRouter> 
     </Provider> 
     , document.querySelector('.container')); 

请注意,你必须提供每个路线的路径。默认的路由配置就是这样的。这应该是最后一次,因为它与给定顺序中的url相匹配。

<Route path="/" component={PostsIndex} /> 

该组件可以简单地写成这样。

import React, { Component } from 'react'; 
class PostsIndex extends Component { 
    render() { 
    return (
     <div> 
     Index page 
     </div> 
    ) 
    } 
} 

无论如何,我还没有使用类型脚本与反应,因为它很少使用。但是上面给出的方法应该可行。

希望这会有所帮助。快乐编码!

+0

Ravindra Ranwala,谢谢你的回答。 我试过安装react-router-dom和修改后的代码。 但同样的错误发生。 '计数器''计数器''NotFound'这些类型是函数。 这是错误的原因吗? – hohihohi

+0

你能否用最新的代码更新这个问题,以便我可以研究这个问题。看起来你已经从错误的路径导入了Counter组件,或者你现在可能已经导出了模块。请用最新的错误消息和代码更新问题,以便我可以进一步研究这一点。 –

+0

我只是注意到你有两个不同的路径相同的计数器组件。删除其中一个并再次尝试。我更新了answ.er –

-1

我最新的代码

import * as ReactDOM from 'react-dom'; 
import * as React from 'react'; 
import { BrowserRouter as Router, Route, Switch, RouteComponentProps } from 'react-router-dom'; 
import { Provider } from 'react-redux'; 

import Counter from './containers/Container'; 
import store from './stores/store'; 
import NotFound from './components/NotFound'; 

class PostsIndex extends React.Component<RouteComponentProps<any>, {}> { 
    render() { 
    return (
     <div> 
     Index page 
     </div> 
    ) 
    } 
} 

ReactDOM.render(
    <Provider store={store}> 
    <Router> 
     <div> 
     <Switch> 
      <Route exact path="/" component={PostsIndex} /> 
      <Route exact path="/counter" component={Counter} /> 
      <Route component={NotFound} /> 
     </Switch> 
     </div> 
    </Router> 
    </Provider> 
    , document.getElementById('app') 
); 

容器/组件

export default connect(
    (state: ReduxState) => ({value: state.counter}), 
    (dispatch: Dispatch<ReduxAction>, ownProps: RouteComponentProps<{myParams: string}>) => { 
    return {actions: new ActionDispatcher(dispatch)} 
    } 
)(Counter); 

错误消息

ERROR in /workspace/react-router-typescript/node_modules/@types/react-router/index.d.ts 
(46,29): error TS2314: Generic type 'Component<P, S>' requires 2 type argument(s). 

ERROR in /workspace/react-router-typescript/node_modules/@types/react-router/index.d.ts 
(56,31): error TS2314: Generic type 'Component<P, S>' requires 2 type argument(s). 

ERROR in /workspace/react-router-typescript/node_modules/@types/react-router/index.d.ts 
(74,28): error TS2314: Generic type 'Component<P, S>' requires 2 type argument(s). 

ERROR in /workspace/react-router-typescript/node_modules/@types/react-router/index.d.ts 
(79,29): error TS2314: Generic type 'Component<P, S>' requires 2 type argument(s). 

ERROR in /workspace/react-router-typescript/node_modules/@types/react-router/index.d.ts 
(87,35): error TS2314: Generic type 'Component<P, S>' requires 2 type argument(s). 

ERROR in /workspace/react-router-typescript/node_modules/@types/react-router/index.d.ts 
(92,29): error TS2314: Generic type 'Component<P, S>' requires 2 type argument(s). 

ERROR in ./src/Index.tsx 
(24,10): error TS2604: JSX element type 'Switch' does not have any construct or call signatures. 

ERROR in ./src/Index.tsx 
(25,12): error TS2604: JSX element type 'Route' does not have any construct or call signatures. 

ERROR in ./src/Index.tsx 
(26,12): error TS2604: JSX element type 'Route' does not have any construct or call signatures. 

ERROR in ./src/Index.tsx 
(27,12): error TS2604: JSX element type 'Route' does not have any construct or call signatures. 

有可能是在一个错误的反应路由器...
构建失败,但成功页面转换和呈现...

+0

错误很明显。为什么您使用,{}>作为组件。它期望你传递两个道具,但是没有任何东西被传入。只需删除它们,并仅从React.Component中扩展它。这将解决您的问题。 –

+0

答案已更新。 –

0

我无法用语言表达谢意!
在修改node_modules/@types/react-router/index.d.ts之后修正了这个Bug。

之前

export class MemoryRouter extends React.Component<MemoryRouterProps> { } 
export class Prompt extends React.Component<PromptProps> { } 
export class Redirect extends React.Component<RedirectProps> { } 
export class Route extends React.Component<RouteProps> { } 
export class Router extends React.Component<RouterProps> { } 
export class StaticRouter extends React.Component<StaticRouterProps> { } 

export class MemoryRouter extends React.Component<MemoryRouterProps, void> { } 
export class Prompt extends React.Component<PromptProps, void> { } 
export class Redirect extends React.Component<RedirectProps, void> { } 
export class Route extends React.Component<RouteProps, void> { } 
export class Router extends React.Component<RouterProps, void> { } 
export class StaticRouter extends React.Component<StaticRouterProps, void> { } 

这是 “@类型/反应路由器”: “^ 4.0.12” 的错误。

+2

您绝对不应该手动编辑'node_modules'文件夹的内容。 –

0

我有类似的问题,改变之后从

export class Provider extends React.Component<ProviderProps> { } 

export class Provider extends React.Component<ProviderProps, void> { } 
在index.d.ts

,消失的问题。 希望这可以帮助你。

相关问题