Typescript flatMap, flat, flatten не существует для типа any []

141

Я использую хром 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но все еще не решил.

Haziq
источник

Ответы:

289

Вы должны добавить es2019или es2019.arrayв свои --libнастройки, чтобы TypeScript распознал array.flat()и flatMap().

Пример:

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

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

Аарон Бил
источник
4
Ага, я воспроизвожу это, и это работает. Здесь мой compilerOptionsin tsconfig.app.json "lib": [ "es2017", "dom", "esnext.array", ] Спасибо, сэр
Haziq
4
Это не помогло мне в моей IDE, VSCode. Какие-нибудь советы?
timelf123
4
@ timelf123 вы перезапускали IDE?
Брайан Аллан Вест
1
Есть ли причина (и если да, то каков эффект) "esnext"вместо "esnext.array"?
maninak 03
7
Примечание: flatMap теперь поддерживается в узле 11+
JeffMinsungKim 01
4

Пока вы ждете стабильности, вы можете расширить интерфейс глобального массива, после чего он будет добавлен в библиотеку по умолчанию.

interface Array<T> {
    flat(): Array<T>;
    flatMap(func: (x: T) => T): Array<T>;
}
Фентон
источник
4

Ответ Аарона Билла превосходен. Возможно, стоит знать, что если "lib" не указана в файле tsConfig.JSON, будет введен список библиотек по умолчанию. Внедренные библиотеки по умолчанию: ► Для --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

Манодж Рана
источник