如何在TypeScript库中指定@types/react的最低依赖版本
这个问题的核心在于Yarn的依赖解析逻辑:@types/react-router对@types/react的宽松依赖(*)导致它被解析到了较低的16.4.14版本,而你的mylibrary对@types/react的^16.8.0要求没有被优先考虑。下面是几个可行的解决方案:
方案一:在consumer中直接声明@types/react依赖
直接在consumer的package.json中添加@types/react作为直接依赖,指定你需要的版本范围。直接依赖的优先级高于间接依赖,Yarn会优先使用这个版本来满足所有间接依赖的需求。
修改后的consumer package.json:
"dependencies": { "react-router": "4.3.1", "@types/react-router": "4.4.4", "mylibrary": "5.0.8", "@types/react": "^16.8.0" }
之后重新执行yarn install,Yarn会解析并安装^16.8.0范围内的版本。
方案二:调整mylibrary的依赖声明(推荐)
对于类库项目,类型包(比如@types/react)更适合放在peerDependencies中,而不是dependencies。这样你的库会要求使用者提供满足最低版本要求的@types/react,避免重复安装和版本不一致的问题。
修改后的mylibrary package.json:
"dependencies": { "react": "16.8.3" }, "peerDependencies": { "@types/react": "^16.8.0" }, // 可选:添加meta字段避免安装时的警告(适用于Yarn/NPM 7+) "peerDependenciesMeta": { "@types/react": { "optional": true } }
这样consumer在安装时,会自动选择满足mylibrary的^16.8.0要求的版本,同时兼容react-router的宽松依赖。
方案三:使用Yarn的resolutions强制指定版本
如果你不想修改依赖结构,可以通过Yarn的resolutions字段强制指定@types/react的版本,忽略其他依赖的版本要求。
在consumer的package.json中添加:
"resolutions": { "@types/react": "^16.8.0" }
然后执行yarn install,Yarn会强制将@types/react解析为你指定的版本范围。
为什么原来的解析会出错?
从你的yarn why输出可以看到,@types/react@16.4.14是被@types/react-router的依赖hoisted上来的。Yarn在处理宽松依赖(*)时,默认会选择仓库中可用的最低兼容版本,但这个版本并不满足mylibrary的^16.8.0要求。通过上面的方案,我们可以强制Yarn优先满足更高版本的要求。
内容的提问来源于stack exchange,提问作者Yser

