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.

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.


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>;
}

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"],}

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.