Estoy usando Chrome 70 y Chrome agrega métodos .flatMap, .flatten, .flat. Entonces mi código se ejecuta como se esperaba. Desafortunadamente, a Typecript 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[]'.

Por cierto, estoy usando Angular 6, que usa Typescript ~2.9.2 y ya incluyo import 'core-js/es7/array'; en polyfills.ts.

Supongo que no hay que escribir para estos métodos, e intenté npm run -dev @types/array.prototype.flatmap pero aún no resolví.

112
Haziq 30 nov. 2018 a las 14:11

3 respuestas

La mejor respuesta

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.

233
Aaron Beall 15 ago. 2019 a las 20:58

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 las bibliotecas que se agregaron previamente automáticamente. (ver: https://www.typescriptlang.org/docs/handbook/compiler -options.html para más información)

"compilerOptions": {

   "target": "es6",

   "lib": [ "es2019", "DOM", "ES6" ,"DOM.Iterable", "ScriptHost"],}
1
Hector Crean 12 may. 2020 a las 19:08

Puede extender 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>;
}
4
Fenton 30 nov. 2018 a las 11:25