tsconfig.json中lib同时配置dom和dom.iterable是否存在冗余?
结论
同时配置"dom"和"dom.iterable"不属于无意义的冗余配置,是否需要同时配置和你项目使用的TypeScript版本有关。
两个配置项的差异说明
dom是TypeScript提供的核心浏览器类型库,包含Window、Document、HTMLElement等所有基础DOM、BOM接口的类型定义。dom.iterable是独立拆分的补充类型库,专门为DOM类数组对象补充ES迭代器接口的类型声明,覆盖的对象包括NodeList、HTMLCollection、DOMTokenList、NamedNodeMap等。
版本兼容逻辑
在TypeScript 4.6版本发布之前,dom库默认不包含dom.iterable的内容:
如果只配置
["dom"],你在使用for...of遍历document.querySelectorAll返回的NodeList、或者用扩展运算符[...document.querySelectorAll('div')]转换类数组时,TypeScript会抛出类型错误,因为它无法识别这些DOM对象的迭代器接口。
只有同时添加dom.iterable,才能让上述语法的类型校验正常通过。
从TypeScript 4.6版本开始,官方已经将dom.iterable的内容合并进了dom库,如果你项目使用的是4.6及以上的TS版本,同时配置两个确实是冗余的,只保留["dom"]即可。
常见多配置写法的原因
很多开源项目、技术教程里会同时写两个,核心是为了向下兼容低版本TypeScript,避免不同开发环境的TS版本不一致导致的类型报错,属于兼容性兜底的写法。
这种写法不会产生任何副作用:lib配置仅影响类型校验阶段,不会被打包进最终的生产代码,重复配置也不会增加产物体积。
选型建议
- 项目仅使用TS 4.6及以上版本:只保留
["dom"]即可 - 项目需要兼容TS 4.5及更低版本,或者是通用的配置模板:保留两个配置项更稳妥
内容的提问来源于stack exchange,提问作者kimbaudi
相关产品推荐
相关产品推荐

