递归异步生成器函数的返回类型



定义以下递归异步函数生成器的正确类型是什么?

async function* recursive_f(n: number): AsyncGenerator<number, ?, ?> {
n++
if(n>0) {
yield n
return await recursive_f(n)
}
return Promise.resolve()
}

以下代码未按预期工作。它应该递归地减少n,并在负的时候产生它,相反,它将通过if条件并结束。

async function* recursive_f(n: number): AsyncGenerator<number> {

if (n < 0) {
yield n
}
return await recursive_f(n--) // 'await' has no effect on the type of this expression.
}
async function main_function() {
console.log(`main_function`)
let num = 10
for await (const n of recursive_f(num)) {
console.log(n)
}
}
main_function().then(console.log, console.error)

如果没有一个包含用例的最小可复制示例,我无法判断以下内容是否符合您的需求,请检查。


您可以定义这样的递归类型别名:

type RecursiveF = AsyncGenerator<number, void | RecursiveF>;

这意味着:RecursiveF是一个异步生成器函数,它生成number,并返回voidRecursiveF。在实践中,这似乎很难使用,因为void类型的值实际上无法检查。但这取决于您和您的用例。

无论如何,现在您可以用它来注释recursiveF的返回类型:

async function* recursive_f(n: number): RecursiveF {
n++
if (n > 0) {
yield n
return recursive_f(n)
}
return Promise.resolve()
}

这在编译器同意它的意义上是有效的。它是否满足你的需求由你自己决定。

游乐场链接到代码

最新更新