Typescript flatMap, flat, flatten не існує на будь-якому типі []


139

Я використовую хром 70, а хром додає методи .flatMap, .flatten, .flat. Тож мій код працює як очікувалося. На жаль, Typescript не подобається.

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

я отримав попередження TS2339: Property 'flatMap' does not exist on type 'any[]'.

До речі , я використовую Angular 6, які використовують , Typescript ~2.9.2і я вже включають import 'core-js/es7/array';в polyfills.ts.

Я здогадуюсь, що для цих методів немає типізації, і я намагався, npm run -dev @types/array.prototype.flatmapале все ще не вирішував.

Відповіді:


282

Ви повинні додати es2019або es2019.arrayдо свого --libналаштування для TypeScript для розпізнавання array.flat()та flatMap().

Приклад:

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

Раніше це було доступно як частина esnextабо esnext.array, але це тепер офіційно частина ES2019.


4
Так, я це відтворюю, і це працює. Ось мій compilerOptionsв tsconfig.app.json "lib": [ "es2017", "dom", "esnext.array", ] Спасибі сер
Хазік

4
Це не виправили це для мене в моєму IDE, VSCode. Якісь поради?
timelf123

3
@ timelf123 Ви перезапустили IDE?
Брайан Аллан Вест

1
Чи є причина (і якщо так, то який ефект) використання "esnext"замість "esnext.array"?
maninak

7
Примітка: flatMap зараз підтримується у вузлі 11+
JeffMinsungKim

4

Ви можете розширити інтерфейс глобального масиву, поки ви будете чекати стабільності, і тоді він буде доданий до бібліотеки за замовчуванням.

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

4

Відповідь Аарона Біла - відмінна. Можливо, варто знати, що якщо у файлі tsConfig.JSON "lib" не вказано, вводиться список бібліотек за замовчуванням. Бібліотеки за замовчуванням, які вводяться: ► Для - target ES5: DOM, ES5, ScriptHost ► Для - target ES6: DOM, ES6, DOM.Iterable, ScriptHost

Іншими словами: ми повинні вказати ті лінзи, які раніше були додані автоматично. (див. https://www.typescriptlang.org/docs/handbook/compiler-options.html для отримання додаткової інформації)

"compilerOptions": {

   "target": "es6",

   "lib": [ "es2019", "DOM", "ES6" ,"DOM.Iterable", "ScriptHost"],}

2

Для вирівнювання однорівневого масиву

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

До плоского багаторівневого масиву

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

щоб глибоко знати, ви також можете перевірити посилання нижче

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.