microsoft / microsoft/TypeScript
flatMap errors when callback returns certain union types
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- Go
- Estrellas
- 111k
- Forks
- 14.3k
- Merge medio
- 1 d 19 h
- PR fusionados (30 d)
- 117
Descripción
TypeScript Version: 3.4.3
Search Terms: flat, flatmap
Code
// Map<string, number[]>
const myMap = new Map([
['foo', [1, 2, 3]],
['bar', [4, 5, 6]]
]);
// string[]
const myArray = ['foo', 'bar', 'baz'];
// (key: any) => number[] | undefined
const mapFn = key => myMap.get(key);
const flatMapped = myArray.flatMap(mapFn);
Actual behavior:
With strict null checks on:
Argument of type '(key: any) => number[] | undefined' is not assignable to parameter of type '(this: undefined, value: string, index: number, array: string[]) => number | readonly number[]'.
Type 'number[] | undefined' is not assignable to type 'number | readonly number[]'.
Type 'undefined' is not assignable to type 'number | readonly number[]'. ts(2345)
Turning strict null checks off prevents the error as you might expect, but that's obviously not desirable.
More generally, any callback that returns foo[] | bar (where bar is not compatible with foo) seems to run into the same issue. The Map.prototype.get example I've used here just seems like it would be a relatively common use case in particular (you'd typically follow it up by calling .filter(Boolean) or similar on the mapped result).
More code
Seeing if doing the operations separately will help:
// (number[] | undefined)[]
const mapped = myArray.map(mapFn);
// any[] !!
const flattened = mapped.flat();
Expected behavior:
flatMapped/flattened result to be inferred as (number | undefined)[].
Playground Link:
Doesn't seem to be able to load the appropriate library definition, even with /// <reference lib="es2019.array" />
Related Issues:
#29604 seems to be related to the .flat() part.
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
Reproducir el ejemplo de TypeScript 3.4.3 con strict null checks habilitado, comparando flatMap(mapFn) con las llamadas separadas a map y flat. Rastrear la definición de la biblioteca y el comportamiento de la comprobación de tipos para callbacks que devuelven number[] | undefined; se considera terminado cuando el ejemplo indicado acepta el callback e infiere (number | undefined)[] como se espera.
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