Typoskript flatMap, flat, flatten existiert nicht für type any []

136

Ich verwende Chrome 70 und Chrome fügt Methoden hinzu .flatMap, .flatten, .flat. Mein Code läuft also wie erwartet. Typescript gefällt das leider nicht.

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

Die Warnung, die ich bekam, ist TS2339: Property 'flatMap' does not exist on type 'any[]'.

Übrigens benutze ich Angular 6, welche verwenden Typescript ~2.9.2und ich bereits import 'core-js/es7/array';in polyfills.ts.

Ich vermute, dass es für diese Methoden keine Eingabe gibt, und ich habe versucht, npm run -dev @types/array.prototype.flatmapaber immer noch nicht zu lösen.

Haziq
quelle

Antworten:

277

Sie sollten hinzufügen es2019oder es2019.arrayIhre zur --libEinstellung für Typoskript zu erkennen array.flat()und flatMap().

Beispiel:

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

Früher war dies als Teil von esnextoder verfügbar esnext.array, jetzt ist es offiziell Teil von ES2019.

Aaron Beall
quelle
4
Ja, ich reproduziere das und es funktioniert. Hier mein compilerOptionsin tsconfig.app.json "lib": [ "es2017", "dom", "esnext.array", ] Danke Sir
Haziq
4
Dies hat es für mich in meiner IDE, VSCode, nicht behoben. Irgendwelche Tipps?
timelf123
3
@ timelf123 hast du deine IDE neu gestartet?
Brian Allan West
1
Gibt es einen Grund (und wenn ja, wie wirkt es sich aus), "esnext"statt zu verwenden "esnext.array"?
Maninak
7
Hinweis: flatMap wird jetzt in Knoten 11+ unterstützt
JeffMinsungKim
4

Sie können die globale Array-Schnittstelle erweitern, während Sie auf Stabilität warten. Ab diesem Zeitpunkt wird sie der Standardbibliothek hinzugefügt.

interface Array<T> {
    flat(): Array<T>;
    flatMap(func: (x: T) => T): Array<T>;
}
Fenton
quelle
3

Aaron Bealls Antwort ist ausgezeichnet. Es kann sinnvoll sein zu wissen, dass eine Standardliste von Bibliotheken eingefügt wird, wenn "lib" nicht in der Datei tsConfig.JSON angegeben ist. Die eingefügten Standardbibliotheken sind: ► Für --target ES5: DOM, ES5, ScriptHost ► Für --target ES6: DOM, ES6, DOM.Iterable, ScriptHost

Mit anderen Worten: Wir müssen die Bibliotheken angeben, die zuvor automatisch hinzugefügt wurden. ( Weitere Informationen finden Sie unter: https://www.typescriptlang.org/docs/handbook/compiler-options.html )

"compilerOptions": {

   "target": "es6",

   "lib": [ "es2019", "DOM", "ES6" ,"DOM.Iterable", "ScriptHost"],}
Hector Crean
quelle
1

Zu flaches einstufiges Array

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

Zu flaches mehrstufiges Array

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

Um genau zu wissen, können Sie auch den folgenden Link überprüfen

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

Manoj Rana
quelle