Async/Await 函数总是返回 Promise 实例,无论 return 何值均被自动包装或直接返回 Promise,调用时立即执行但立刻返回 pending Promise,await 仅暂停函数内部执行流,且 await 只能在 async 函数内使用。

Async/Await 函数本质上是 Promise 的语法糖,它的类型特点不是靠“声明时写明”,而是由 JavaScript 引擎根据 async 关键字 和 函数体行为 自动确定的。检测它的类型,关键在于理解它“总是返回 Promise”这一不可绕开的核心特征。
返回值必为 Promise 实例
只要函数被标记为 async,无论内部 return 什么,最终返回的一定是一个 Promise 对象:
- return 一个普通值(如字符串、数字、对象)→ 自动包装为
Promise.resolve(value) - return 一个已存在的 Promise → 直接返回该 Promise(不额外包装)
- 没有 return 或 return undefined → 等价于
return Promise.resolve(undefined) - 抛出错误(throw)→ 返回
Promise.reject(error)
函数本身是同步调用、异步返回
调用 async 函数时,函数体**立即开始执行**(同步进入),但一旦遇到 await,就会暂停当前函数的后续执行,把控制权交还给事件循环;而函数本身会**立刻返回一个 pending 状态的 Promise**:
- 这个返回的 Promise 就是函数的“类型体现”——你可以用
typeof fn() === 'object'且fn() instanceof Promise来确认 - 它不会阻塞主线程,UI 渲染、定时器等仍可正常运行
- await 暂停的是该 async 函数内部的执行流,不是整个 JS 线程
无法在顶层或普通函数中使用 await
await 的存在本身就限定了上下文类型:
- 只能出现在
async function内部,否则语法报错 - 模块顶层(ESM)支持
await(Top-level await),但此时它所在的模块会被视为异步模块,加载时返回 Promise - 试图在非 async 函数里写 await,会直接触发 SyntaxError,这是最直接的“类型校验失败”信号
运行时可借助 Promise 构造器特征识别
实际检测时,不必依赖 TypeScript 类型注解或 IDE 提示,而应观察其行为表现:
- 调用后立刻得到一个 Promise:可链式调用
.then()/.catch() -
console.log(fn())总是打印Promise {<pending>}或已 resolve/reject 的状态 - 用
Object.prototype.toString.call(fn())得到[object Promise] - 即使函数体只有一行
return 123,fn() instanceof Promise仍为 true


















