You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Hacklang中异步函数无法作为shape类型值的问题咨询及原因问询

在Hacklang的Shape中定义异步函数类型的问题

你的写法确实是非法的,Hack的类型系统不允许在shape的类型定义里直接使用async function()这种语法来标注异步函数类型,下面来详细解释原因和正确的写法。

为什么这种写法不合法?

Hack里的async关键字是语法糖,它的作用是让函数能够使用await,并自动将函数的返回值包装成Awaitable<T>类型。但从类型系统的角度来看,异步函数的本质就是一个返回Awaitable<T>的普通函数——类型系统只关心函数的参数列表和返回值类型,不关心函数内部是不是用了异步逻辑。

所以在类型标注(比如shape的字段类型定义)里,async关键字是多余且不被允许的,因为它不属于类型签名的一部分,类型检查器只认函数的参数和返回值类型。

正确的写法

你只需要把async function(): Awaitable<string>改成function(): Awaitable<string>即可,去掉async关键字,只保留函数的返回值类型为Awaitable<string>。修正后的代码如下:

const type TAbc = shape(
  'works' => (function (): string),
  'doesnt_work' => (function(): Awaitable<string>)
);

而且你完全不用担心这样定义后不能赋值异步函数——当你给这个shape字段赋值时,传入异步函数是完全合法的,因为异步函数的返回值正好是Awaitable<string>,和类型定义匹配:

// 合法的赋值示例
$abc: TAbc = shape(
  'works' => () => "sync result",
  'doesnt_work' => async () => "async result"
);

总结

Hack的类型标注体系中,函数类型仅描述参数和返回值的类型,async属于函数实现层面的特性,不属于类型签名的一部分。所以在shape或其他类型定义里,只需要指定返回值为Awaitable<T>的函数类型,就能兼容异步函数的赋值。

内容的提问来源于stack exchange,提问作者Abhishek Jha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 06:32:39