TypeScript target 编译选项详解
target 决定 TS 编译产物的 JavaScript 版本:语法降级、API 可用性与运行环境匹配。本文讲解取值含义、环境匹配策略与常见配置错误。
target 控制产物语法版本:"target": "ES2022" 保留 async/await 等现代语法,低版本 target 会把它们降级转译。选择原则:匹配你的运行环境——Node 22 项目用 ES2022+,浏览器项目按支持矩阵(现代浏览器 ES2020+ 已安全)。
target 管什么
编译产物的语法版本:async/await、class、可选链等语法特性在高 target 下原样保留,低 target 下转译为等价的老语法。注意:target 只管语法不管 API——Promise、fetch 等运行时 API 由 lib 选项与 polyfill 负责。
取值速查
| target | 对应环境 |
|---|---|
| ES5 | 古董浏览器(仅特殊需求) |
| ES2015/ES6 | 老浏览器基线 |
| ES2020 | 现代浏览器安全基线 |
| ES2022 | Node 18+/现代浏览器 |
| ESNext | 最新特性(工具链转译场景) |
环境匹配策略
// Node 22 服务端
{ "target": "ES2022", "lib": ["ES2022"] }
// Vite 前端项目(构建链还会处理)
{ "target": "ESNext" }
// 浏览器直连(无打包器)
{ "target": "ES2020" }
用打包器时 target 可激进(ESNext)——esbuild/SWC 层还会按浏览器目标再转译;Node 直跑时必须匹配 Node 版本实际支持的语法。
低 target 的代价
降级转译的 async/await(状态机化)体积膨胀、性能下降、堆栈失真——没必要地低 target 是三输。明确你的真实运行环境底线,不要"以防万一"用 ES5。
常见问题(FAQ)
Q:target 和 lib 的区别?
target 管语法版本;lib 管类型层面的 API 可用性(ES2022 lib 提供 Array.at 的类型)。通常配套设置。
Q:Node 项目怎么确认可用语法?
对照 node.green 或官方文档;粗略规则:Node LTS 版本 - 2 年的 ES 标准(Node 22 ≈ ES2023)。
Q:module 和 target 的关系?
正交:module 管模块格式(CommonJS/ESM),target 管语法版本。NodeNext 场景两者由 module 选项联动推导。
参考文档
本文依据公开文档整理,示例需按项目依赖版本验证;不将文档中的性能描述视为本项目实测结果。