定义以下递归异步函数生成器的正确类型是什么?
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
,并返回void
或RecursiveF
。在实践中,这似乎很难使用,因为void
类型的值实际上无法检查。但这取决于您和您的用例。
无论如何,现在您可以用它来注释recursiveF
的返回类型:
async function* recursive_f(n: number): RecursiveF {
n++
if (n > 0) {
yield n
return recursive_f(n)
}
return Promise.resolve()
}
这在编译器同意它的意义上是有效的。它是否满足你的需求由你自己决定。
游乐场链接到代码