microsoft / microsoft/TypeScript
Trying to flatten an array with unknown depth causes a type error
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- Go
- Estrellas
- 111k
- Forks
- 14.4k
- Merge medio
- 1 d 19 h
- PR fusionados (30 d)
- 117
Descripción
Bug Report
Trying to flatten an array with unknown depth causes a type error.
🔎 Search Terms
flatInfinity
🕗 Version & Regression Information
- Errors in version 4.2.4
- This changed between versions 3.6.2 and 3.7.5 (but probably just because the type definitions aren't supported prior)
The PR https://github.com/microsoft/TypeScript/pull/32131 provides a definition for FlatArray that has this issue.
⏯ Playground Link
Playground link with relevant code
💻 Code
// first define a nested list with arbitrary depth
type Nested<T> = (T | Nested<T>)[];
const arr: Nested<number> = [1,[2,[3]]];
// locally, this bit fails for me (version 4.2.4)
//
// with an error '"recur"' is referenced directly or indirectly in its own type annotation.
const res: number[] = arr.flat(Infinity);
// you can do a quick workaround as follows:
const res2: number[] = (arr as any[]).flat(Infinity);
// but for some reason on the TypeScript playground this doesn't fail, but you can emulate it
// by using the following definition that is equivalent to the one provided in the standard library:
// https://github.com/microsoft/TypeScript/blob/d8e9f6951919a347bb155b938a5006f9efabb778/lib/lib.es2019.array.d.ts#L21
type FlatArray2<Arr, Depth extends number> = {
"done": Arr,
"recur": Arr extends ReadonlyArray<infer InnerArr>
? FlatArray2<InnerArr, [-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20][Depth]>
: Arr
}[Depth extends -1 ? "done" : "recur"];
// causes a type error: '"recur"' is referenced directly or indirectly in its own type annotation.
type TestFlat<T> = FlatArray2<Nested<T>, typeof Infinity>
🙁 Actual behavior
The code errors with '"recur"' is referenced directly or indirectly in its own type annotation.
🙂 Expected behavior
The code to pass typechecking.
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Línea de trabajo
Reproduce el error con el ejemplo proporcionado de un array anidado e inspecciona la definición de FlatArray en lib/lib.es2019.array.d.ts, junto con PR 32131. Determina cómo la tipificación de flat para una profundidad desconocida debería evitar el error de tipo recursivo y, a continuación, verifica que arr.flat(Infinity) supera la comprobación de tipos sin debilitar el tipo de resultado esperado.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- typescript
- Área
- compilers
- Tipo de issue
- Error
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 35/100