返回Promise<void>的async函数无return语句是否合规?
无return语句的async函数是否合规?
我搜了很久没找到明确答案:没有return语句的async函数会不会有问题,或者不符合规范?举个例子,下面这段TypeScript代码无法编译:
// 抽象一个可跨多数据库使用的更新函数 public async updateGenericDatabase(v: string): Promise<void> { // 数据库特定客户端返回非void值,导致编译失败: // (以前大家觉得return await没必要,现在反而更推荐了,哈哈...) return await updateSpecificDAandReturnNonVoid(v); // 编译失败... }
改成下面的写法就能编译,但我总觉得不妥,因为没有显式返回Promise,想请教这种写法是否完全合规,或是存在代码瑕疵?
public async updateGenericDatabase(v: string): Promise<void> { await updateSpecificDAandReturnNonVoid(v); // 可以编译,但... }
结论:这种写法完全合规,没有代码瑕疵
原因解析:
- async函数的本质特性:不管你有没有显式写
return,async函数都会自动把函数的执行结果包装成Promise。如果函数没有return语句,async会默认返回Promise<void>,刚好和你声明的返回类型Promise<void>完全匹配。 - 第一个代码编译失败的根本原因:
updateSpecificDAandReturnNonVoid(v)返回的是Promise<T>(T是某个非void类型),当你写return await时,async函数会把这个T值包装成Promise<T>,但你声明的返回类型是Promise<void>,类型不匹配,所以TypeScript会报错。 - 第二个写法的合理性:
await会等待异步操作完成,不管原Promise的返回值是什么,函数执行完毕后没有return任何内容,async就会自动生成Promise<void>返回,完全符合类型声明,是标准的正确写法。
补充说明:
- 如果你的需求只是等待异步更新操作完成,不需要返回任何数据,这种写法是推荐的。
- 关于
return await的误区:以前觉得直接return Promise和return await Promise效果一样,但如果有try/catch捕获异步错误的场景,return await能确保错误被捕获,现在确实更建议用,但这里是因为类型不匹配才不能用,不是写法本身有问题。
内容的提问来源于stack exchange,提问作者ChetPrickles
相关产品推荐
相关产品推荐

