TS 表达式生成的联合类型过于复杂,无法用 Material-UI 和 @react-three/fiber 表示

Posted

技术标签:

【中文标题】TS 表达式生成的联合类型过于复杂,无法用 Material-UI 和 @react-three/fiber 表示【英文标题】:TS Expression produces a union type that is too complex to represent with Material-UI and @react-three/fiber 【发布时间】:2021-10-11 23:26:21 【问题描述】:

我创建了一个使用 Material-UI 和 @react-three/fiber 库的 Next.js 应用程序。

我最近将 Material-UI 传递到 V5 并出现错误。

这是错误:

我搜索了所有内容以将其删除,但我一无所获。

所以我尝试使用 Material-UI V5 创建一个新项目,并一一安装其他依赖项。一开始没有显示错误,但是当我安装@react-three/fiber AND @react-three/drei 时出现错误。

所以我发现Box 组件是从@material-ui@react-three/drei 导出的,所以我现在明白错误了。

这是我的package.json


  "name": "my-app",
  "version": "0.1.0",
  "private": true,
  "scripts": 
    "dev": "next dev",
    "build": "next build",
    "start": "next start",
    "lint": "next lint"
  ,
  "dependencies": 
    "@emotion/react": "^11.4.0",
    "@emotion/styled": "^11.3.0",
    "@material-ui/core": "^5.0.0-beta.2",
    "@material-ui/styles": "^4.11.4",
    "@react-three/fiber": "^7.0.6",
    "next": "11.0.1",
    "react": "17.0.2",
    "react-dom": "17.0.2"
  ,
  "devDependencies": 
    "@types/react": "17.0.16",
    "eslint": "7.32.0",
    "eslint-config-next": "11.0.1",
    "typescript": "4.3.5"
  

我的 tsconfig.json


  "compilerOptions": 
    "baseUrl": "src",
    "target": "es5",
    "lib": ["dom", "dom.iterable", "esnext"],
    "allowJs": true,
    "skipLibCheck": true,
    "strict": true,
    "forceConsistentCasingInFileNames": true,
    "noEmit": true,
    "esModuleInterop": true,
    "module": "esnext",
    "moduleResolution": "node",
    "resolveJsonModule": true,
    "isolatedModules": true,
    "jsx": "preserve"
  ,
  "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"],
  "exclude": ["node_modules"]

但我没有找到解决方法...

有人有想法吗?

【问题讨论】:

【参考方案1】:

由于导入@react-three/drei,我遇到了同样的错误。我已成功本地化文件,导致出现错误,但我无法确定根本原因。我会感谢更多精通 TypeScript 的人提供的所有意见。

这是一个相当丑陋的解决方法。 删除所有这些定义文件:

node_modules/@react-three/drei/core/ MeshWobbleMaterial.d.ts MeshDistortMaterial.d.ts PointMaterial.d.ts

当然,现在你不能在 Typescript 上下文中使用这些组件。

您可以使用patch-package分享固定这些更改。这将设置一个安装后步骤,在运行npm/yarn install 后应用更改(已删除的文件)。

【讨论】:

谢谢,但如果你重做npm install,被删除的模块会再次出现吗? 这将由patch-package 解决。当您将 "postinstall": "patch-package" 放入您的 package.json 时,在 npm install 期间下载软件包后,此脚本将删除 .d 文件(如果存在)。请查看补丁包的说明,或在需要帮助时问我! 成功了!!!这太糟糕了!【参考方案2】:

解决方案 1

MaterialUI 稳定版修复了这个问题。

使用这个包:

npm install @mui/material

Vivere 的解决方案 2

component 属性添加到 div 以避免 TypeScript 错误。

<Box component="div">...</Box>

【讨论】:

我也遇到了这个错误。我了解@mui/material和三个库都导出了Box,但是为什么会出现这个错误呢? 不错不错。你走在好路上!这是我的 package.json:gist.github.com/Melvynx/f1b1402411d1d7ef1d47c58d90cebfac 所以我设法通过编写盒子的组件类型来解决它:&lt;Box component="div" ... 这很奇怪,但它现在可以工作。我向muifiber GitHub 提交了一个问题。希望我能得到某种指导,让我理解这种行为。 经过数小时的寻找,再次寻找,摸不着头脑,重命名模块,阅读 webpack 文档,阅读打字稿文章,github 问题日志,代码拆分,令人作呕,@Vivere 你的最后一条注释解决了这个问题。 .. 谢谢! ...我应该注意,这也是使用巴比伦的一个问题...现在可以这样做,但是必须有比这更好的解决方法... 我在我的回答@Vivere 中添加了您的评论

以上是关于TS 表达式生成的联合类型过于复杂,无法用 Material-UI 和 @react-three/fiber 表示的主要内容,如果未能解决你的问题,请参考以下文章

错误 TS2349:无法调用其类型缺少调用签名的表达式。类型 ' ; ' 没有兼容的调用签名

TS/SFC/RenderProp:无法调用类型缺少调用签名的表达式

TS——联合类型

错误 TS2349:无法调用其类型缺少调用签名的表达式

AngularX TS错误无法调用类型缺少调用签名的表达式[关闭]

TS2339:联合类型上不存在属性 - 属性字符串 |不明确的