Open mfulton26 opened 1 year ago
Here is a slightly more minimal example (Playground):
function* zeros(): Generator<number, never> {
for (;;) yield 0
}
function* ones(): Generator<number, never> {
for (const num of zeros()) yield num+1
}
Gives error "A function returning 'never' cannot have a reachable end point. (2534)"
I expected TypeScript to be able to tell that a for..of on a Generator<..., never>
could never finish similar to how it's able to tell that the for (;;)
in the first function would never finish.
π 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
andgenerator
.β― Playground Link
https://www.typescriptlang.org/play?#code/GYVwdgxgLglg9mAVAAggTwgGwKYB4AqAfABQxTYBOAhgEY4BcyAkudXXkQJSMDi2YlKlDgUCAGmQCAbpQngAJtmAwB8wsgDeAKGTIA7gAsYOZMSgUQ2TsjQxsmeSjKD2Abi0BfLVtCRYCFGwADyoAWwAHHDNgqEYAZ3MVAHNuZD4BamFRAFoARmQAH2RciWlKdW1dYBFTCAQE1AMqCmQ4YFQMKIBBCmo0ADpgCjhQ6KCoTkmbOwdG5uQAXiXkACJcFeQAfmQ85EZc9w8gA
π» Code
π Actual behavior
The second generator function build on top of the first where consumers of
cycle
do not need to checkIteratorResult#done
as thenever
return type is interpreted as neverdone
. This is great for direct callers ofcycle()
but other generator functions building on top ofcycle()
are not inferred too as having a return type ofnever
.π 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: