NPM 包无法用作 JSX 组件 - 类型错误

Ray*_*Ray 137 npm typescript typescript-typings

我在某些包的打字稿项目中遇到了这些奇怪的类型错误。前任:

'TimeAgo' cannot be used as a JSX component.
  Its instance type 'ReactTimeago<keyof IntrinsicElements | ComponentType<{}>>' is not a valid JSX element.
    The types returned by 'render()' are incompatible between these types.
      Type 'React.ReactNode' is not assignable to type 'import("/home/user/app/node_modules/@types/react-bootstrap-table-next/node_modules/@types/react/index").ReactNode'.
        Type '{}' is not assignable to type 'ReactNode'.
Run Code Online (Sandbox Code Playgroud)

我在本地 Windows 计算机上没有遇到这些类型错误,但它们在我的 Linux 虚拟机中不断发生。我已经多次删除该项目,克隆我的存储库并在不同版本的节点中再次安装软件包,但仍然遇到相同类型的错误。

已检查节点12.18.3、16.13.1

以下是一些快速包 json 信息:

"react-timeago": "^6.2.1",
"react-custom-scrollbars": "^4.2.1",
"react-custom-scrollbars-2": "^4.4.0",
"react": "^17.0.2",
"next": "^12.1.1",
"@types/react-custom-scrollbars": "^4.0.10",
"@types/react-timeago": "^4.1.3",
"@types/react": "^17.0.44",
"typescript": "^4.3.5"
"@types/node": "^14.18.12",
Run Code Online (Sandbox Code Playgroud)

这发生在基本的自定义组件上:

MyTst.tsx
import TimeAgo from "react-timeago";

const Mytst = () => {
  return (
    <div>
      <TimeAgo date={"02/02/2022"} />
    </div>
  );
};

export default Mytst;
Run Code Online (Sandbox Code Playgroud)

我也收到了 react-custom-scrollbars-2 的错误。包含组件的库和与其关联的 @types 文件之间的类型正确匹配似乎存在问题。有人对如何解决这些类型错误有任何想法吗?

Yev*_*bak 321

有同样的问题。只需添加这个

"resolutions": {
  "@types/react": "17.0.2",
  "@types/react-dom": "17.0.2"
},
Run Code Online (Sandbox Code Playgroud)

文件package.json并运行yarn命令。

UPD:只是有点详细的答案:

@types/react-dom有其自己的依赖项,其中之一是@types/react将版本设置为'*'- 主要版本,现在可能指的是18.

即使您在package.json(没有^)父包中指定了一些严格版本,也可能会安装您已经用于其自身目的的包的重复版本。

通过使用,resolutions我们对依赖项的依赖项指定了严格的限制。

  • 我必须在 Lerna 设置的根目录中添加 package.json 解析才能使其正常工作 (6认同)
  • 这为我解决了这个问题,谢谢。构建可以在本地运行,但不能在我们的 CI Alpine 容器中运行。看起来某种类型的类型版本差异可能已被推送到 NPM 中的 React 或相关库中。 (3认同)
  • 通过降级@types/react版本对我有用“依赖项”:{“@types/react”:“^17.0.0”,} (2认同)

小智 65

您将需要修复@types/react包的版本,因为许多 React 库的依赖项设置为@types/react : "*",这将采用最新版本的包。(我想他们刚刚发布了版本 18)

为此,您可以将其添加到 package.json 中

"resolutions": {
  "@types/react": "^17.0.38"
}
Run Code Online (Sandbox Code Playgroud)

它可以很好地与yarn配合使用,但如果您使用npm,那么您还需要将其添加到package.json的“scripts”部分中

"preinstall": "npm install --package-lock-only --ignore-scripts && npx npm-force-resolutions"
Run Code Online (Sandbox Code Playgroud)

这将简单地使用npm-force-resolutions包来修复分辨率中的版本。

完成后npm install,您的应用程序应该可以正常工作。


Chr*_*ebb 9

与样式组件一起使用。分辨率对我不起作用,所以这是另一个解决方案:

蛮力式铸造:

const ThemeProviderFixed = ThemeProvider as unknown as React.FC<PropsWithChildren<{ theme: string }>>;
Run Code Online (Sandbox Code Playgroud)

  • 感谢您的解决方案。我做了同样的事情来解决问题。从 'react-shadow-root' 导入 ReactShadowRoot;const ReactShadowRootFixed = ReactShadowRoot 与 React.FC&lt;PropsWithChildren&lt;{children: ReactNode }&gt;&gt; 一样未知; (2认同)
  • 谢谢你!!经过几个小时的搜索,终于找到了对我有用的解决方案! (2认同)

kld*_*is4 8

我最近在 Yarn monorepo 中遇到了这个问题,其中 Typescript create-react-app 子项目有installConfig.hoistingLimits=workspace. 此配置可防止将依赖项提升到 monorepo 的顶层。

运行时react-scripts start,类型检查器仍在查看顶层@types,没有找到@types/react与项目上配置的 React 版本匹配的内容。解决该问题的修复是将以下内容添加到tsconfig.json子项目中:

"compilerOptions": {
  ...
  "typeRoots": ["./node_modules/@types"]
},
...
Run Code Online (Sandbox Code Playgroud)

这会将 Typescript 指向为特定子项目安装的类型定义。


小智 7

我知道今天发布

rm -rf node_modules
rm -rf yarn.lock
npm install
Run Code Online (Sandbox Code Playgroud)

刚刚使用 npm install 解决了问题,但我不知道发生了什么


Bru*_*ino 6

Sahil 的答案对于npm 和yarn 是正确的,但如果您使用pnpm,则需要在package.json文件中进行稍微不同的设置:

"pnpm": {
  "overrides": {
    "@types/react": "^17.0.38"
  }
}
Run Code Online (Sandbox Code Playgroud)

如果您使用带有多个包的单一存储库,则这只适用于package.json存储库的根文件。您可以在 pnpm 文档中阅读更多相关信息。


小智 5

我也遇到了同样的问题,所以我更新了npm版本^6.0.0 -> 8.0.0并解决了。

检查 npm 版本。


小智 5

我最近在升级到 React 18 时遇到了这个问题,并且忘记升级 devDependency 中相应的类型。

对我有用的是升级 React 类型以匹配 package.json 文件,如图所示

{
    ...
    "dependencies": {
        ...
        "react": "^18.1.0",
    },
    "devDependencies": {
        ...
        "@types/react": "^18.0.8",
    }
}
Run Code Online (Sandbox Code Playgroud)