TypeScript 中的 types 编译选项

说明 compilerOptions.types 如何控制哪些类型包会被自动放进全局作用域,以及它为什么常用来显式约束 Node、Jest、Vite 等环境类型。

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

[!info] related notes

TypeScript 中的 types 编译选项

一句话定义

compilerOptions.types 用来显式控制哪些类型包会被自动加入当前项目的全局类型环境。

核心机制 / 工作原理

默认情况下,TypeScript 会把所有“可见”的 @types/* 包都纳入项目。

当配置:

{
  "compilerOptions": {
    "types": ["node", "jest"]
  }
}

时,TypeScript 只会把列出的这些类型包加入全局作用域。

这直接影响:

  • process
  • expect
  • describe
  • 以及其他由类型包注入的全局变量

最小例子 / 最小场景

Node 项目

{
  "compilerOptions": {
    "types": ["node"]
  }
}

这表示当前项目显式启用 Node 的全局类型。

测试环境

{
  "compilerOptions": {
    "types": ["node", "jest"]
  }
}

这时像 describeitexpect 这类测试全局符号才会被自动识别。

边界与易混淆点

它不等于 package.json 里的 types

tsconfig 里的 compilerOptions.types 讨论的是:

  • 当前项目自动加载哪些类型包

package.json 里的 types 讨论的是:

  • 这个包对外暴露的类型入口文件在哪里

这是两层完全不同的事情。

它和 lib 不同

lib 更像是:

  • JavaScript 标准库和宿主 API 类型

types 更像是:

  • 额外第三方类型包或环境类型包

它和 typeRoots 也不同

如果说 types 是:

  • 指定启用哪些包名

那么 typeRoots 更像是:

  • 指定去哪些目录里找这些类型包

可以继续看:

它不会阻止你显式导入某个模块类型

即使某个包没有出现在 types 里,只要你显式 import 了它,TypeScript 仍然会去解析对应模块的类型。

types 主要影响的是“自动进入全局作用域的类型包”。

参考信息

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