【问题标题】:JSX element type 'ReactElement<any> is not a constructor function for JSX elements. Type 'undefined' is not assignable to type 'Element | null'JSX 元素类型 'ReactElement<any> 不是 JSX 元素的构造函数。类型“未定义”不可分配给类型“元素 |空值'
【发布时间】:2020-09-18 18:46:45
【问题描述】:

我尝试了删除node_modules/yarn.lock并重新安装所有内容的推荐解决方案,但没有解决。

我正在制作一个简单的路由器,它根据道具呈现子级:

import React, { Fragment } from "react";

type RouterProps = {
  currentRoute: string;
  children: React.ReactNode;
};

const Router = ({ currentRoute, children }: RouterProps) => {
  return React.Children.map(children, child =>
    React.cloneElement(child as React.ReactElement<any>, { currentRoute })
  );
};

type RouterViewProps = {
  route: string;
  children: any;
};

Router.View = ({ route, currentRoute, children }: RouterViewProps) => (
  <div>{currentRoute === route ? <Fragment>{children}</Fragment> : null}</div>
);

export default Router;

尝试在应用程序中使用我的组件时出现错误:

import React from "react";
import Router from "./components/Router";
import Home from "./components/Home";

function App() {
  return (
    <div>
      <Router currentRoute="home">
        <Router.View route="home">
          <Home />
        </Router.View>
      </Router>
    </div>
  );
}

export default App;

完全错误:

TypeScript error in /Users/gonzo/Projects/JS/filex-workshops-registration/src/App.tsx(8,7):
JSX element type 'ReactElement<any, string | ((props: any) => ReactElement<any, string | ... | (new (props: any) => Component<any, any, any>)> | null) | (new (props: any) => Component<any, any
, any>)>[] | null | undefined' is not a constructor function for JSX elements.
  Type 'undefined' is not assignable to type 'Element | null'.  TS2605

     6 |   return (
     7 |     <div>
  >  8 |       <Router currentRoute="home">
       |       ^
     9 |         <Router.View route="home">
    10 |           <Home />
    11 |         </Router.View>

Router 组件在我的测试中完美运行,所以我不明白应用程序本身有什么不同。

【问题讨论】:

    标签: javascript reactjs typescript create-react-app


    【解决方案1】:

    Router 不是 JSX 的构造函数,因为它不返回 JSX。

    const Router = ({ currentRoute, children }: RouterProps) => {
      return (
        <>
           {React.Children.map(children, child =>
              React.cloneElement(child as React.ReactElement<any>, { currentRoute })
           )}
        </>
      );
    };
    

    【讨论】:

      猜你喜欢
      • 2019-05-18
      • 2019-07-21
      • 2019-11-24
      • 2020-05-31
      • 2019-05-29
      • 2019-03-06
      • 1970-01-01
      • 1970-01-01
      • 2020-09-16
      相关资源
      最近更新 更多