infinite generator transform is no longer infiniteΒ #56363
Open
Description
π Search Terms
A function returning 'never' cannot have a reachable end point.
π Version & Regression Information
This is the behavior in every version I tried, and I reviewed the FAQ for entries about never
and generator
.
β― Playground Link
π» Code
function* cycle<T>(iterable: Iterable<T>): Generator<T, never, undefined> {
while (true) yield* iterable;
}
function* example(text: string): Generator<-1 | 1, never> {
for (const char of cycle(Array.from(text))) yield char === "<" ? -1 : 1;
}
π Actual behavior
The second generator function build on top of the first where consumers of cycle
do not need to check IteratorResult#done
as the never
return type is interpreted as never done
. This is great for direct callers of cycle()
but other generator functions building on top of cycle()
are not inferred too as having a return type of never
.
π Expected behavior
A loop over an infinite generator (i.e. one with a return type of never
) is also inferred as an infinite loop.
Additional information about the issue
A throw
statement can be added after the loop as a workaround but I think this shouldn't be necessary:
function* example(text: string): Generator<-1 | 1, never> {
for (const char of cycle(Array.from(text))) yield char === "<" ? -1 : 1;
throw new Error("unreachable");
}