Le type flatMap, flat, flatten n'existe pas sur le type any []

141

J'utilise chrome 70 et chrome ajoute des méthodes .flatMap, .flatten, .flat. Mon code fonctionne donc comme prévu. Malheureusement, Typescript ne l'aime pas.

// data.flatMap lint error
export const transformData = (data: any[]) => data.flatMap(abc => [
   parentObj(abc),
   ...generateTasks(abc)
]);

l'avertissement que j'ai est TS2339: Property 'flatMap' does not exist on type 'any[]'.

Par la façon dont je me sers Angular 6, qui utilise Typescript ~2.9.2et je déjà inclus import 'core-js/es7/array';dans polyfills.ts.

Je suppose qu'il n'y a pas de saisie pour ces méthodes, et j'ai essayé de le npm run -dev @types/array.prototype.flatmaprésoudre, mais toujours pas.

Haziq
la source

Réponses:

286

Vous devez ajouter es2019ou es2019.arrayà votre --libparamètre pour que TypeScript reconnaisse array.flat()et flatMap().

Exemple:

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

Auparavant, il était disponible dans le cadre de esnextou esnext.array, mais il fait maintenant officiellement partie de ES2019.

Aaron Beall
la source
4
Ouais je reproduis ceci et ça marche. Ici mon compilerOptionsdans tsconfig.app.json "lib": [ "es2017", "dom", "esnext.array", ] Merci monsieur
Haziq
4
Cela ne l'a pas résolu pour moi dans mon IDE, VSCode. Des conseils?
timelf123
4
@ timelf123 avez-vous redémarré votre IDE?
Brian Allan West
1
Y a-t-il une raison (et si oui quel est l'effet) d'utiliser "esnext"au lieu de "esnext.array"?
maninak le
7
Remarque: flatMap est maintenant pris en charge dans le nœud 11+
JeffMinsungKim
4

Vous pouvez étendre l'interface du tableau global pendant que vous attendez la stabilité, auquel point elle sera ajoutée à la bibliothèque par défaut.

interface Array<T> {
    flat(): Array<T>;
    flatMap(func: (x: T) => T): Array<T>;
}
Fenton
la source
4

La réponse d'Aaron Beall est excellente. Il peut être intéressant de savoir que si "lib" n'est pas spécifié dans le fichier tsConfig.JSON, une liste par défaut de bibliothèques est injectée. Les bibliothèques par défaut injectées sont: ► Pour --target ES5: DOM, ES5, ScriptHost ► Pour --target ES6: DOM, ES6, DOM.Iterable, ScriptHost

En d'autres termes: nous devons spécifier les bibliothèques qui ont été précédemment ajoutées automatiquement. (voir: https://www.typescriptlang.org/docs/handbook/compiler-options.html pour plus d'informations)

"compilerOptions": {

   "target": "es6",

   "lib": [ "es2019", "DOM", "ES6" ,"DOM.Iterable", "ScriptHost"],}
Hector Crean
la source
2

Vers un tableau plat à un niveau

arr.reduce((acc, val) => acc.concat(val), []);

Vers un réseau plat à plusieurs niveaux

function flatDeep(arr, d = 1) {
   return d > 0 ? arr.reduce((acc, val) => acc.concat(Array.isArray(val) ? flatDeep(val, d - 1) : val), []) : arr.slice();
};

pour en savoir plus, vous pouvez également consulter le lien ci-dessous

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flat

Manoj Rana
la source