Mecanografiado flatMap, flat, flatten no existe en ningún tipo []

138

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 uso Typescript ~2.9.2y ya incluyo import 'core-js/es7/array';en polyfills.ts.

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

Haziq
fuente

Respuestas:

281

Debe agregar es2019o es2019.arraya su --libconfiguración para que TypeScript reconozca array.flat()y flatMap().

Ejemplo:

{
  "compilerOptions": {
    "target": "es5",
    "lib": [
      "es2019"
    ]
  }
}

Anteriormente, esto estaba disponible como parte de esnexto esnext.array, pero ahora es oficialmente parte de ES2019.

Aaron Beall
fuente
4
Sí, reproduzco esto y funciona. Aquí mi compilerOptionsen tsconfig.app.json "lib": [ "es2017", "dom", "esnext.array", ] Gracias señor
Haziq
4
Esto no me solucionó en mi IDE, VSCode. ¿Algun consejo?
timelf123
3
@ timelf123 ¿reinició su IDE?
Brian Allan West
1
¿Hay alguna razón (y si es así, cuál es el efecto) de usar en "esnext"lugar de "esnext.array"?
maninak
7
Nota: flatMap ahora es compatible con el nodo 11+
JeffMinsungKim
4

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>;
}
Fenton
fuente
4

La respuesta de Aaron Beall es excelente. Puede valer la pena saber que si "lib" no se especifica 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 previamente se agregaron automáticamente. (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"],}
Héctor Crean
fuente