TypeScript 中的 typeRoots

说明 typeRoots 如何限制 TypeScript 自动加载哪些类型包,以及它和 types 的差异在哪里。

#tech / dev #resource / typescript #type / concept #status / growing

[!info] related notes

TypeScript 中的 typeRoots

一句话定义

typeRoots 用来限制 TypeScript 只从哪些目录里自动收集类型包。

核心机制 / 工作原理

官方文档说明,默认情况下 TypeScript 会把所有“可见”的 @types 包都纳入 compilation。

例如父级目录中的:

  • ./node_modules/@types
  • ../node_modules/@types
  • ../../node_modules/@types

都可能被视为可见。

如果配置:

{
  "compilerOptions": {
    "typeRoots": ["./typings", "./vendor/types"]
  }
}

那么 TypeScript 只会从这些目录里加载类型包,而不会再去自动扫描默认的 node_modules/@types

最小例子 / 最小场景

显式限定类型包来源

{
  "compilerOptions": {
    "typeRoots": ["./typings"]
  }
}

这常见于:

  • 有一批自定义全局声明目录
  • 想隔离自动注入的第三方类型
  • monorepo 中需要更强的类型边界控制

边界与易混淆点

它和 types 不同

两者都在控制“自动进来的类型环境”,但粒度不同:

  • typeRoots 控制去哪些目录找类型包
  • types 控制具体启用哪些包名

也就是说:

  • typeRoots 更像控制搜索范围
  • types 更像控制允许名单

一旦写了 typeRoots,默认 @types 自动发现就不再生效

这是它最容易踩坑的地方。

如果你手动指定了 typeRoots,却没有把真正需要的类型目录包含进去,就会出现:

  • process 突然不存在
  • 测试全局类型消失
  • 某些第三方类型不再可见

它不是给普通源码 alias 用的

typeRoots 管的是类型包目录,不是:

  • src 源码路径映射
  • import alias

那些仍然更接近:

  • paths
  • baseUrl

参考信息

创建于 2026/5/15 更新于 2026/5/27