TypeScript 中的 types 编译选项
说明 compilerOptions.types 如何控制哪些类型包会被自动放进全局作用域,以及它为什么常用来显式约束 Node、Jest、Vite 等环境类型。
#tech / dev
#resource / typescript
#type / concept
#status / growing
[!info] related notes
- 所属 MOC: TypeScript MOC
- 配置入口: tsconfig 使用详解
- 并列概念: TypeScript 中的 lib, TypeScript 中的 typeRoots, TypeScript 中的全局声明与全局扩展
TypeScript 中的 types 编译选项
一句话定义
compilerOptions.types 用来显式控制哪些类型包会被自动加入当前项目的全局类型环境。
核心机制 / 工作原理
默认情况下,TypeScript 会把所有“可见”的 @types/* 包都纳入项目。
当配置:
{
"compilerOptions": {
"types": ["node", "jest"]
}
}
时,TypeScript 只会把列出的这些类型包加入全局作用域。
这直接影响:
processexpectdescribe- 以及其他由类型包注入的全局变量
最小例子 / 最小场景
Node 项目
{
"compilerOptions": {
"types": ["node"]
}
}
这表示当前项目显式启用 Node 的全局类型。
测试环境
{
"compilerOptions": {
"types": ["node", "jest"]
}
}
这时像 describe、it、expect 这类测试全局符号才会被自动识别。
边界与易混淆点
它不等于 package.json 里的 types
tsconfig 里的 compilerOptions.types 讨论的是:
- 当前项目自动加载哪些类型包
而 package.json 里的 types 讨论的是:
- 这个包对外暴露的类型入口文件在哪里
这是两层完全不同的事情。
它和 lib 不同
lib 更像是:
- JavaScript 标准库和宿主 API 类型
而 types 更像是:
- 额外第三方类型包或环境类型包
它和 typeRoots 也不同
如果说 types 是:
- 指定启用哪些包名
那么 typeRoots 更像是:
- 指定去哪些目录里找这些类型包
可以继续看:
它不会阻止你显式导入某个模块类型
即使某个包没有出现在 types 里,只要你显式 import 了它,TypeScript 仍然会去解析对应模块的类型。
types 主要影响的是“自动进入全局作用域的类型包”。
参考信息
- TSConfig
types: https://www.typescriptlang.org/tsconfig/types.html