为何设置target: es2017后TypeScript仍转译async/await?
问题原因及解决方法
为什么target参数看似未生效?
- tsconfig.json未被正确加载:如果执行
tsc时直接指定单个文件(比如tsc index.ts),TypeScript会忽略tsconfig.json,改用默认配置(默认target通常为es3或es5),这时候就会将async/await转译为辅助函数。 - 配置存在冲突或遗漏:比如命令行参数
--target覆盖了配置文件的设定,或者显式设置lib时未包含es2017,导致编译时无法识别该版本的语法支持。 - TypeScript版本过低:旧版本TS对
es2017的语法保留逻辑不完善,和Playground使用的新版本行为不一致。
实现Playground效果的步骤
- 确保tsconfig.json被正确读取
- 不要直接指定单个文件编译,直接运行
tsc命令,它会自动加载当前目录下的tsconfig.json。 - 若需编译特定文件,在tsconfig的
include数组中添加目标文件:{ "compilerOptions": { "target": "es2017" }, "include": ["index.ts"] }
- 不要直接指定单个文件编译,直接运行
- 修正配置冲突
- 避免同时使用命令行
--target参数,它会覆盖配置文件的设置。 - 如果显式设置了
lib,确保包含es2017:"lib": ["es2017", "dom"]
- 避免同时使用命令行
- 升级TypeScript版本
- 运行
npm install typescript@latest --save-dev,将本地TS版本升级到和Playground一致的最新稳定版。
- 运行
- 验证效果
- 编写测试代码:
async function fetchData() { await Promise.resolve('data'); } - 执行
tsc后查看生成的JS文件,应该直接保留async function fetchData() { await Promise.resolve('data'); },而非生成__awaiter和__generator辅助函数。
- 编写测试代码:
内容的提问来源于stack exchange,提问作者Dan Fabulich
相关产品推荐
相关产品推荐

