Maszynopis flatMap, flat, flatten nie istnieje w typie any []

141

Używam chrome 70 i chrome dodaje metody .flatMap, .flatten, .flat. Więc mój kod działa zgodnie z oczekiwaniami. Niestety, Typescript tego nie lubi.

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

ostrzeżenie, które otrzymałem, to TS2339: Property 'flatMap' does not exist on type 'any[]'.

Nawiasem mówiąc używam Angular 6, które wykorzystują Typescript ~2.9.2i zawierają już import 'core-js/es7/array';w polyfills.ts.

Domyślam się, że nie ma wpisywania dla tych metod i próbowałem, npm run -dev @types/array.prototype.flatmapale nadal nie rozwiązałem.

Haziq
źródło

Odpowiedzi:

286

Należy dodać es2019lub es2019.arraydo --libustawienia, aby TypeScript rozpoznawał array.flat()i flatMap().

Przykład:

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

Wcześniej było to dostępne jako część esnextlub esnext.array, ale teraz jest oficjalnie częścią ES2019.

Aaron Beall
źródło
4
Tak, odtwarzam to i działa. Oto moja compilerOptionsw tsconfig.app.json "lib": [ "es2017", "dom", "esnext.array", ] Dziękuję panu
Haziq
4
To nie rozwiązało problemu w moim IDE, VSCode. Jakieś wskazówki?
timelf123
4
@ timelf123 czy zrestartowałeś swoje IDE?
Brian Allan West
1
Czy istnieje powód (a jeśli tak, jaki jest skutek) używania "esnext"zamiast "esnext.array"?
maninak
7
Uwaga: flatMap jest teraz obsługiwany w węźle 11+
JeffMinsungKim
4

Możesz rozszerzyć globalny interfejs tablicy podczas oczekiwania na stabilność, po czym zostanie on dodany do domyślnej biblioteki.

interface Array<T> {
    flat(): Array<T>;
    flatMap(func: (x: T) => T): Array<T>;
}
Fenton
źródło
4

Odpowiedź Aarona Bealla jest doskonała. Warto wiedzieć, że jeśli w pliku tsConfig.JSON nie podano „lib”, wstrzyknięta zostanie domyślna lista bibliotek. Domyślne wstawione biblioteki to: ► For --target ES5: DOM, ES5, ScriptHost ► For --target ES6: DOM, ES6, DOM.Iterable, ScriptHost

Innymi słowy: musimy określić te biblioteki, które zostały wcześniej dodane automatycznie. (więcej informacji: https://www.typescriptlang.org/docs/handbook/compiler-options.html )

"compilerOptions": {

   "target": "es6",

   "lib": [ "es2019", "DOM", "ES6" ,"DOM.Iterable", "ScriptHost"],}
Hector Crean
źródło
2

Do płaskiego szyku jednopoziomowego

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

Do płaskiej tablicy wielopoziomowej

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

aby dowiedzieć się więcej, możesz również sprawdzić poniższy link

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

Manoj Rana
źródło