reactjs 在具有更高React版本的node_module上出现Typescript错误

jjhzyzn0  于 2023-06-29  发布在  React
关注(0)|答案(1)|浏览(219)

我有一个用React 18做的@company/module,但主项目仍然使用React 17。现在,如果我导入这个模块,tsc在主项目上失败,因为使用了它的@types/react v17.0.44,它不包括React 18的新类型。
错误是:Module "react" has no exported member 'useId'

  • 有没有办法在不将主项目升级到React 18的情况下解决这个问题?
  • 我怎样才能使tsc使用@types/react来相应地对模块进行响应?

我有skipLibCheck: true,它仍然检查模块并失败。
这是完整的tsconfig:

{
  "allowSyntheticDefaultImports": true,
  "compilerOptions": {
    "target": "es6",
    "lib": ["dom", "dom.iterable", "esnext"],
    "allowJs": true,
    "skipLibCheck": true,
    "strict": false,
    "forceConsistentCasingInFileNames": true,
    "noEmit": true,
    "module": "esnext",
    "moduleResolution": "node",
    "resolveJsonModule": true,
    "isolatedModules": true,
    "jsx": "preserve",
    "baseUrl": ".",
    "downLevelIteration": true,
    "paths": {
      "~/*": ["src/*"]
    },
  },
  "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"],
  "exclude": ["node_modules"]
}
hfsqlsce

hfsqlsce1#

这个问题的一个可能的解决方案是在package.json文件中使用像patch-package或resolutions这样的包来覆盖主项目使用的@types/react版本。
例如,您可以在package.json中添加resolutions字段,如下所示:

"resolutions": {
  "@types/react": "^18.0.0"
}

这将强制您的主项目使用版本18的@types/react,即使它以前使用的是版本17。
或者,您可以尝试在模块的代码中使用仅类型导入,以避免从React 18导入导致问题的新类型。例如,可以将import语句更改为:

import type { UseIdHook } from 'react';

这将只导入UseIdHook的类型,而不实际导入实现,这应该允许代码编译而不会出错。
希望这能帮上忙

相关问题