Estoy usando Chrome 70 y Chrome agrega métodos .flatMap , .flatten , .flat . Entonces mi código se ejecuta como se esperaba. Desafortunadamente, a TypeScript no le gusta.
// data.flatMap lint error export const transformData = (data: any[]) => data.flatMap(abc => [ parentObj(abc), ...generateTasks(abc) ]); La advertencia que recibí es TS2339: Property 'flatMap' does not exist on type 'any[]'.
Estoy usando Angular 6, que usa Typescript ~2.9.2, y ya import 'core-js/es7/array'; en polyfills.ts .
Supongo que no hay escritura para estos métodos, y traté de npm run -dev @types/array.prototype.flatmap pero aún no lo resolví.
Intenté la mayoría de las respuestas y no me funcionaron. IDE: código VS
pero esto hizo
npm i -D @types/nodeTambién puede agregar esnext a su --lib en lugar de 'es2019'
"compilerOptions": { "target": "es2015", "lib": ["dom", "esnext"] }Funcionó para mí.
A partir de angular 11 y gracias a TypeScript 3.9 , esta es ahora la nueva configuración.
"compilerOptions": { "target": "es2018", "module": "es2020", "lib": ["es2020", "dom"], }es2020 en lugar de esnext ?En TypeScript 3.9, el comportamiento del compilador de TypeScript controlado por el módulo es el mismo con los valores "esnext" y "es2020". Este comportamiento puede cambiar en el futuro, porque la opción "esnext" podría evolucionar de formas incompatibles con versiones anteriores, lo que daría lugar a errores en tiempo de compilación o tiempo de ejecución durante una actualización de TypeScript. Como resultado, el código puede volverse inestable. El uso de la opción "es2020" mitiga este riesgo.
Puede ampliar la interfaz de matriz global mientras espera la estabilidad, momento en el que se agregará a la biblioteca predeterminada.
interface Array<T> { flat(): Array<T>; flatMap(func: (x: T) => T): Array<T>; }Debe agregar es2019 o es2019.array a su configuración --lib para que TypeScript reconozca array.flat() y flatMap() .
Ejemplo:
{ "compilerOptions": { "target": "es5", "lib": [ "es2019" ] } } Anteriormente, esto estaba disponible como parte de esnext o esnext.array , pero ahora es oficialmente parte de ES2019.
La respuesta de Aaron Beall es excelente. Puede valer la pena saber que si no se especifica "lib" en el archivo tsConfig.JSON, se inyecta una lista predeterminada de bibliotecas. Las bibliotecas predeterminadas inyectadas son: ► Para --target ES5: DOM,ES5,ScriptHost ► Para --target ES6: DOM,ES6,DOM.Iterable,ScriptHost
En otras palabras: debemos especificar aquellas librerías que se agregaron previamente de forma automática. (consulte: https://www.typescriptlang.org/docs/handbook/compiler-options.html para obtener más información)
"compilerOptions": { "target": "es6", "lib": [ "es2019", "DOM", "ES6" ,"DOM.Iterable", "ScriptHost"],}Si está en una versión anterior a es2019, puede implementar un shim para proporcionar una funcionalidad similar a .flat() y .flatMap() proporcionada por bibliotecas posteriores.
A matriz plana de un solo nivel
arr.reduce((acc, val) => acc.concat(val), []);A una matriz multinivel plana
function flatDeep(arr, d = 1) { return d > 0 ? arr.reduce((acc, val) => acc.concat(Array.isArray(val) ? flatDeep(val, d - 1) : val), []) : arr.slice(); };para saber más profundamente, también puede consultar el siguiente enlace
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flat