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 选项联动推导。


参考文档

本文依据公开文档整理,示例需按项目依赖版本验证;不将文档中的性能描述视为本项目实测结果。

延伸阅读

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台