-
Notifications
You must be signed in to change notification settings - Fork 12.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Trying to flatten an array with unknown depth causes a type error #44408
Comments
Now that we have genuine recursive conditional types, I wonder if this shouldn't be refactored to use them. Either way, recursion limits exist and problems will happen; I guess someone could hand-tune the definition to try to avoid them: type FlatArrayʹ<A, D extends number> =
D extends -1 ? A :
A extends ReadonlyArray<infer I> ? FlatArrayʹ<
I, [-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...20[]][D]
> : A;
interface Array<T> {
flatʹ<A, D extends number = 1>(
this: A,
depth?: D
): FlatArrayʹ<A, D>[];
}
const arr: Nested<number> = [1, [2, [3]]];
// I'm not sure what type we expect to see coming out of `arr.flat(Infinity)
// Infinity is just some unknown number as far as the compiler is concerned
// we just don't want a crash
const res = arr.flatʹ(Infinity); // const res: (number | Nested<number>)[] 🤷♂️ But I feel like recursion in the standard lib always is going to be prone to this no matter what. |
Yeah, it's hard without dependent types. We might be able to get away with certain type operations on numbers (e.g., see work over at https://github.com/granule-project/granule), so that we could capture more information on how we are flattening without restricting the number of levels. With support for natural numbers, we might be able to make use of (semi-dependent?) elimination to get some nice recursion without hitting any limits. I think for |
There's no |
Using Array.flat() on an array whose depth cannot be determined at compile-time causes an obscure and seemingly unrelated type error: microsoft/TypeScript#44408
Bug Report
Trying to flatten an array with unknown depth causes a type error.
🔎 Search Terms
flat
Infinity
🕗 Version & Regression Information
The PR #32131 provides a definition for
FlatArray
that has this issue.⏯ Playground Link
Playground link with relevant code
💻 Code
🙁 Actual behavior
The code errors with
'"recur"' is referenced directly or indirectly in its own type annotation.
🙂 Expected behavior
The code to pass typechecking.
The text was updated successfully, but these errors were encountered: