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
相关产品推荐
相关产品推荐

