【问题标题】:React / NextJS: Type error: 'Component' cannot be used as a JSX componentReact / NextJS:类型错误:\'Component\' 不能用作 JSX 组件
【发布时间】:2023-01-31 05:00:44
【问题描述】:

我有一个 NextJS React Application 17.0.2,它在呈现单个页面之前声明了一堆提供程序。

在我的./src/pages/_app.tsx 中,我有以下代码-sn-p:

<ExistingPortfolioProvider registry={registry}>
    <CrankProvider>
        <Component {...pageProps} />
    </CrankProvider>
</ExistingPortfolioProvider>

此代码 sn-p 在我的开发环境中运行(运行 next dev 时)。但是,当我将其上传到 Vercel 时,出现以下错误。

Type error: 'Component' cannot be used as a JSX component.
  Its element type 'ReactElement<any, any> | Component<{}, any, any> | null' is not a valid JSX element.
    Type 'Component<{}, any, any>' is not assignable to type 'Element | ElementClass | null'.
      Type 'Component<{}, any, any>' is not assignable to type 'ElementClass'.
        The types returned by 'render()' are incompatible between these types.
          Type 'React.ReactNode' is not assignable to type 'import("/vercel/path0/dapp-nextjs/node_modules/@types/react-transition-group/node_modules/@types/react/index").ReactNode'.
            Type '{}' is not assignable to type 'ReactNode'.
              Type '{}' is missing the following properties from type 'ReactPortal': key, children, type, props
  52 |                                             <ExistingPortfolioProvider registry={registry}>
  53 |                                                 <CrankProvider>
> 54 |                                                     <Component {...pageProps} />
     |                                                      ^
  55 |                                                 </CrankProvider>
  56 |                                             </ExistingPortfolioProvider>
  57 |                                         </UserWalletAssetsProvider>
error Command failed with exit code 1.

知道为什么会这样,或者我如何调试它?我已经仔细检查过每个提供商像这样返回children

    return (
        <>
            <ILocalKeypairContext.Provider value={value}>
                {props.children}
            </ILocalKeypairContext.Provider>
        </>
    );

它试图呈现的视图也只有一个返回单个节点(有多个子节点)的组件。

任何想法我还可以调查什么?

--- 更新 1 ---

我编辑了代码以获得“最小示例”,

   9 |     return (
  10 |         <>
> 11 |             <Component {...pageProps} />
     |              ^
  12 |         </>
  13 |     );

仍然遇到同样的问题。这是因为某些 NextJS 的东西渲染必须在服务器端左右吗?

--- 更新 2 ---

它现在在我的笔记本电脑上也失败了。我删除了缓存的 nextjs,yarn.lock,现在必须在本地重现它。

--- 更新 3 ---

我遇到了这个漂亮的线程 https://github.com/facebook/react/issues/24304,但是添加 "preinstall": "npx npm-force-resolutions" 的建议解决方案对我来说在 yarn 上不起作用(出于某种原因它寻找 package-json.lock

【问题讨论】:

  • CrankProvider 组件之间似乎存在语法错误,其中键入了“^”符号。
  • @p4avinash 你怎么看这个? xD
  • 嗯,CrankProvider 似乎没有任何语法错误..
  • <Component {...pageProps} /> 您可以尝试暂时将组件的名称更改为 <ComponentTest {...pageProps} /> 之类的名称并检查。我能够解决类似问题的问题
  • @ChannaveerHakari 我将其更改为&lt;MyComponent {...pageProps} /&gt;(来自&lt;Component {...pageProps} /&gt;)。我不会像这样导入道具 function MyApp({Component: MyComponent, pageProps}: AppProps)(我不能直接重新定义 AppProps 中的类型)。我似乎消除了以前的错误,但现在我遇到了新的错误……看看我能在新错误上调试多少

标签: javascript reactjs web dom


【解决方案1】:

我将我的“@types/react”版本升级到 18.0.1 并且它有效。你试过这个吗?

【讨论】:

  • 如果您正在使用 turbo repo,请注意,您必须更新所有应用程序/包中的@types/react 和@types/react-dom,因为具有多个版本的@types/react 会导致错误坚持。
【解决方案2】:

我删除了版本 17.0.3 中的 @types/react 依赖项,并在当前版本 18.0.9 中再次添加它,它成功运行?

yarn remove @types/react
yarn add @types/react -D

【讨论】:

    【解决方案3】:

    添加

    
    "resolutions": {
        "@types/react": "^17.0.38"
      },
    

    成功了。我在用纱线

    【讨论】:

      【解决方案4】:

      我将 Next.js 更新到 12.1.6 并且它有效(我删除了 yarn.lock 并使用yarn install 再次安装)。这是我的 package.json:

      {
        "name": "javier-portfolio",
        "version": "0.4.0",
        "private": true,
        "scripts": {
          "dev": "next dev",
          "build": "next build",
          "start": "next start",
          "lint": "next lint"
        },
        "dependencies": {
          "@ajna/pagination": "^1.4.17",
          "@chakra-ui/icons": "^2.0.1",
          "@chakra-ui/react": "^1.8.8",
          "@emotion/react": "11",
          "@emotion/styled": "11",
          "framer-motion": "6",
          "next": "12.1.6",
          "react": "^17.0.2",
          "react-dom": "^17.0.2"
        },
        "devDependencies": {
          "@types/node": "^17.0.19",
          "@types/react": "^17.0.30",
          "eslint": "7.32.0",
          "eslint-config-next": "11.1.2",
          "eslint-config-prettier": "^8.3.0",
          "typescript": "^4.4.4"
        },
        "resolutions": {
          "@types/react": "^17.0.30"
        }
      }
      
      

      【讨论】:

        【解决方案5】:

        正如 @javier-rodriguez 所说,更新到 Next 12.1.6 对我来说效果很好

        【讨论】:

          猜你喜欢
          • 2022-07-12
          • 2023-01-08
          • 2022-12-20
          • 2022-06-22
          • 1970-01-01
          • 2021-06-02
          • 2023-01-31
          • 2020-10-23
          • 2022-06-20
          相关资源
          最近更新 更多