@types/react与react版本不一致是否会引发问题?
React 16项目搭配v18版本@types/react相关包的兼容问题说明
跨大版本安装类型包一定会产生类型兼容问题,不存在侥幸空间,具体影响包括以下几类:
- 基础API类型校验完全错乱
React 18对内置类型做了大量不向下兼容的调整:比如v18版本的FC类型移除了默认的children属性定义,你在React 16项目里写常规的函数组件传子元素时,TS会直接抛出类型不存在的报错;同时v18新增了useTransition、useDeferredValue等React 16根本不存在的Hook类型,TS不会提示你这些API在当前运行版本里不存在,很容易写出运行时直接报错的代码。 - 旧API类型丢失
React 18的类型包删除了所有16/17版本存在但18已废弃的API类型定义,比如旧版ReactDOM.render的参数签名、类组件部分旧生命周期的类型标注,你写符合React 16规范的代码时会被TS误判为非法,本该拦截的类型错误反而可能漏过,完全失去TypeScript的类型防护作用。 - 第三方依赖类型冲突
所有适配React 16的UI库、工具库,自身的类型定义都基于v16版本的@types/react编写,和v18版本的类型共存时会出现大量类型结构不匹配的报错,直接导致TS编译流程失败。
正确修复方案
直接安装和本地React大版本完全匹配的类型包即可,执行对应命令:
# npm 用户 npm install --save-dev @types/react@16 @types/react-dom@16 # yarn 用户 yarn add -D @types/react@16 @types/react-dom@16 # pnpm 用户 pnpm add -D @types/react@16 @types/react-dom@16
安装完成后如果还存在类型报错,可以删除node_modules目录和对应包管理器的锁文件,重新执行全量依赖安装清除高版本类型的缓存即可。
注:DefinitelyTyped 生态下的
@types/*包,大版本号和对应主库的大版本号是严格对齐的,跨大版本安装必然出现兼容问题,后续升级类型包时要和实际安装的库版本保持一致。
内容的提问来源于stack exchange,提问作者user18149985
相关产品推荐
相关产品推荐

