javascript 或 typescript 在解析阶段即报 syntaxerror:await 仅允许在 async 函数内使用;必须确保含 await 的函数显式声明为 async,且顶层 await 仅限模块环境。

直接在非 async 函数里写 await,JavaScript 或 TypeScript 会在解析阶段就报 SyntaxError: await is only allowed inside async functions——这是编译期错误,根本不会运行到执行阶段。避免它,核心是守住“await 必须出现在 async 函数作用域内”这一条铁律。
确认函数已用 async 显式声明
这是最基础也最容易被忽略的一环。只要函数体中用了 await,函数声明前就必须加 async:
- ✅ 正确:
async function fetchData() { const res = await fetch('/api'); } - ❌ 错误:
function fetchData() { const res = await fetch('/api'); }(语法错误) - ✅ 箭头函数同理:
const handler = async () => { await doSomething(); };
警惕顶层 await 的使用场景
ES2022 起,顶层 await 在模块(module)中是合法的,但仅限于模块顶层作用域,不适用于普通脚本或函数内部嵌套:
用于 inference.sh 的 JavaScript/TypeScript SDK,可运行 AI 应用、构建代理、集成 150+ 模型。包名:@inferencesh/sdk(npm install),完整 TypeScript 支持。
- ✅ 模块文件首层(无任何函数包裹)可直接写:
const data = await import('./data.js'); - ❌ 在普通
.js脚本(非模块)或函数内部再写顶层风格的await,仍会报错 - ⚠️ 注意:TypeScript 默认按 script 模式解析,需显式设置
"type": "module"或使用.mts后缀才能启用顶层 await
检查编辑器与构建工具配置
有些语法错误表面是 await 问题,实则是环境未识别异步语法:
- 确保 TypeScript 的
target≥ES2017(async/await的最低要求) - 确认 Babel 配置启用了
@babel/plugin-transform-async-to-generator或使用@babel/preset-env并设好targets - VS Code 或 WebStorm 中若提示红色波浪线但代码实际能跑,可能是语言服务未正确识别文件为模块——尝试添加
"type": "module"到package.json
用工具提前拦截误用
光靠人工检查容易疏漏,建议接入静态检查:
- ESLint 规则
no-await-in-loop虽针对循环,但配合require-await和prefer-awaited可辅助发现未被async包裹的await - TypeScript 编译器本身就会在
checkJs: true下对.js文件做类似校验 - CI 流程中加入
tsc --noEmit或eslint --ext .ts,.js,让错误暴露在集成阶段










