Skip to content

tsconfig 选项 详解

真正重要的 tsconfig 选项,按用途分组:收紧类型检查、设定语言 target 与模块、控制产物输出、映射 import 路径、组织多项目构建,以及调优其余检查。

tsconfig 告诉编译器要包含哪些文件、要有多严格。大部分工作由两个选项完成:target 设定 JavaScript 的生成级别,strict 一次性开启整套安全检查。下面的选项都会真正改变行为;默认开启的会注明。先从基础配置继承,再只覆盖不同的部分。

参考表格 · 55 条目
55 of 55 rows
严格性
总开关:一次性启用 strictNullChecks、noImplicitAny 等多个选项。
对无法推断类型的参数和变量报错(否则会成为 any)。
null 和 undefined 不再可赋值给所有类型;需要显式声明。
以逆变方式检查函数参数;捕获不可靠的回调参数类型。
按函数声明的参数对 bind、call 和 apply 进行类型检查。
当类属性没有初始值且未在构造函数中赋值时报错。
可选属性 { p?: T } 不再接受显式赋值 undefined。
要求遮蔽基类成员的成员必须带 override 关键字。
对声明后从未读取的局部变量报错。
对声明后从未读取的函数参数报错。
对没有任何作用的表达式语句报错。
禁止对 index signature 的键使用点访问;请用方括号(obj["key"])。
当一条代码路径返回值而另一条不返回时报错。
当 switch 的 case 未加 break 就落入下一个 case 时报错。
语言与模块
JavaScript 的生成级别(如 ES2022);更新的 target 需要更少的降级转换。
可用的内置 API(如 ES2022、DOM、DOM.Iterable)。
生成的模块系统(如 ESNext、CommonJS、NodeNext)。
采用 Node 的真实规则:每个文件根据最近的 package.json 选择 CJS 或 ESM,相对导入需要文件扩展名。
import 路径的解析方式(如 bundler、node、nodenext)。
文件何时算作模块:auto(按 import/export 的有无)、legacy 或 force(始终)。
允许从 CommonJS 模块使用 default 导入风格(多数配置下默认为 true)。
允许从仅导出命名值的模块使用 default 导入(仅类型层面)。
import 完全按书写原样输出;仅类型导入必须使用 import type(TS 5)。
让 import 将 .json 文件作为带类型的值加载。
将 .js 文件纳入编译输入。
也对 .js 文件做类型检查(读取其 JSDoc 注释);隐含 allowJs。
.tsx 的编译方式:react-jsx(自动运行时)、react(React.createElement)或 preserve。
将自动包含的 @types 包限制为该列表;空数组表示一个都不包含。
扫描 @types 包的目录,取代向上遍历所有 node_modules/@types。
确保每个文件都能单独转译(bundler 和 esbuild 的要求)。
编译输出
编译后的 JavaScript 的输出位置。
源文件的根目录;保持输出目录树形状稳定。
生成 .js.map 文件,让调试器映射回 TypeScript。
将 source map 以注释形式内嵌到 .js 文件中,而不是单独的 .js.map 文件。
生成 .d.ts 类型声明(库必需)。
生成 .d.ts.map 文件,让编辑器从声明跳回 TypeScript 源码。
只生成 .d.ts 文件;JavaScript 交给 bundler(需要 declaration 或 composite)。
复用 tslib 中的 __rest 等辅助函数,而不是生成到每个文件里。
当 target 早于 ES2015 时,正确编译可迭代对象上的 for..of、spread 和解构。
从生成的 JavaScript 中去除注释。
仅做类型检查;不写任何文件(由 bundler 负责产物时使用)。
路径
非相对模块解析的基础目录。
将 import 前缀映射到位置,如 { "@/*": ["src/*"] }。
将多个目录视为单一虚拟根进行解析。
项目结构
将项目标记为可供 project references 构建(启用 declaration、incremental)。
依赖其他 tsconfig 项目,实现更快、彼此隔离的构建。
保存构建信息,下次运行时跳过未变更文件的重新检查。
其他检查
为提速跳过对 .d.ts 文件的类型检查(默认 true)。
对与文件实际大小写不一致的 import 报错。
数组与索引访问返回 T | undefined,而不是 T。
类字段用 Object.defineProperty 创建而非普通赋值(ES2022+ 目标下默认 true)。
启用旧框架所用的传统装饰器语法(标准化之前)。
错误信息中报告完整类型名,而不是截断长名称。
当裸的副作用导入(import "./x.css")解析不到任何内容时报错。
允许以 .ts 结尾的 import 路径(需要 noEmit 或 emitDeclarationOnly)。