如何列出TypeScript项目中tsc编译时正在使用的所有类型包
问题背景对应的原理说明
你给出的代码是典型的Jest测试用例,其中describe、it都是Jest暴露的全局API,对应的类型定义存放在@types/jest中,默认会被TypeScript自动加载到全局作用域,和同样暴露了同名全局API的@types/mocha产生声明冲突,因此需要通过显式配置types限制全局加载的类型包。
compilerOption.types 核心工作规则
- 默认未配置
types字段时,所有node_modules/@types下的类型包都会被自动注入到全局类型作用域,代码可以直接使用对应包暴露的全局类型,不需要显式import。 - 显式配置
types数组后,只有数组中列出的@types包会被自动全局注入,其余@types包不会进入全局作用域,从根源避免同名全局声明的冲突。 types配置仅控制「自动全局注入的类型包」,完全不影响「模块导入时的类型解析」:只要你在代码中通过import引入了某个模块,TypeScript依然会自动查找该模块对应的类型定义(优先使用包自带的类型声明,没有就查找@types下的对应包),无论有没有在types数组中配置。
仅配置
types: ['@types/jest']就能正常编译的原因 你package.json中其他@types/开头的包都不需要全局注入,比如@types/react、@types/lodash这类,都属于模块级类型,只有你通过import引入对应模块时才会被加载,类型绑定在模块作用域内不会污染全局,所以哪怕没有加到types数组里,TypeScript也会在你用到对应模块时自动加载匹配的类型定义,不会产生报错。
这也说明:只配置['@types/jest']不代表tsc没有用到其他@types包,只是其他包不需要全局注入而已。
列出tsc编译时实际用到的所有类型的方法
- 方法1:使用tsc内置参数
执行命令:
tsc --listFiles
该命令会输出编译过程加载的所有文件,包括所有.d.ts类型定义文件,你可以过滤路径中带有@types的条目,就能得到所有用到的@types类型包。Unix系统可以直接用tsc --listFiles | grep @types快速筛选。
- 方法2:开启类型解析日志
在tsconfig.json的compilerOptions中添加配置:
"traceResolution": true
重新执行tsc编译,控制台会输出完整的类型解析链路,包括每个类型文件的查找路径、加载原因,能精准定位所有被加载的类型定义。
- 方法3:通过TS API自定义查询
如果需要程序化获取加载的类型列表,可以使用TypeScript官方提供的API,创建编译程序后遍历program.getSourceFiles(),筛选出所有类型定义文件即可。
内容的提问来源于stack exchange,提问作者Shekhar Joshi
相关产品推荐
相关产品推荐

