TypeScript中async函数前缀报'Unexpected token'错误求助
我来帮你排查这个问题——虽然Node.js 8+已经原生支持async/await语法,但你升级到9.11.1后仍遇到TS的Unexpected token错误,大概率不是Node版本的锅,而是TypeScript配置或编译环节的问题,给你列几个常见的排查和解决方向:
检查TypeScript的编译目标版本
TypeScript默认的编译目标(target)可能是ES3或ES5,这两个版本并不支持async/await语法。你需要在tsconfig.json里明确指定更高的目标版本:{ "compilerOptions": { "target": "ES2017", // 直接支持async/await的版本 "module": "CommonJS" // 适配Node.js的模块系统 } }如果需要兼容更低版本的Node,也可以把
target设为ES2015,同时确保启用downlevelIteration等相关配置让TS把async/await转译为Node支持的代码。确认是否正确编译或运行TypeScript文件
很多人会犯的一个错误:直接用Node执行.ts文件(比如node test.ts),但Node本身无法解析TypeScript语法,必须先编译为JavaScript再运行,或者使用ts-node直接运行:# 先编译再执行 tsc test.ts && node test.js # 或者用ts-node直接运行TS文件 npx ts-node test.ts检查TypeScript版本是否过旧
虽然async/await在TypeScript 1.7版本就已经支持,但如果你的TS版本过于老旧,可能会出现语法识别问题。先检查当前TS版本:tsc --version如果版本低于3.x,建议升级到较新的稳定版本:
npm install typescript --save-dev安装Node.js的类型定义文件
有时候TypeScript无法正确识别Node.js的环境API,导致语法校验出错,安装@types/node可以解决这个问题:npm install @types/node --save-dev排查代码中的隐性语法错误
有时候Unexpected token错误并不是因为async关键字本身,而是函数内部存在其他语法问题(比如漏掉括号、逗号,或者错误的语法嵌套),导致TS解析器报错。比如下面的错误写法:async function test() { return new Promise((resolve) => { setTimeout(() => resolve("done") // 这里漏掉了闭合的括号和括号 }) }仔细检查async函数内部的代码,确认没有其他语法错误。
内容的提问来源于stack exchange,提问作者nick.cook

