Typecript flatMap, flat, flatten não existe no tipo qualquer []

138

Estou usando o Chrome 70 e o Chrome adiciona métodos .flatMap, .flatten, .flat. Portanto, meu código funciona conforme o esperado. Infelizmente, o Typescript não gosta disso.

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

o aviso que recebi é TS2339: Property 'flatMap' does not exist on type 'any[]'.

A propósito, estou usando Angular 6, qual uso Typescript ~2.9.2e já incluo import 'core-js/es7/array';no polyfills.ts.

Meu palpite é que não há digitação para esses métodos, e eu tentei, npm run -dev @types/array.prototype.flatmapmas ainda não consegui resolver.

Haziq
fonte

Respostas:

281

Você deve adicionar es2019ou es2019.arrayà sua --libconfiguração para que o TypeScript reconheça array.flat()e flatMap().

Exemplo:

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

Anteriormente, estava disponível como parte do esnextou esnext.array, mas agora é oficialmente parte do ES2019.

Aaron Beall
fonte
4
Sim, eu reproduzo isso e funciona. Aqui o meu compilerOptionsem tsconfig.app.json "lib": [ "es2017", "dom", "esnext.array", ] Obrigado, senhor
Haziq
4
Isso não resolveu para mim no meu IDE, VSCode. Alguma dica?
timelf123
3
@ timelf123 você reiniciou seu IDE?
Brian Allan West de
1
Existe uma razão (e em caso afirmativo, qual é o efeito) para usar em "esnext"vez de "esnext.array"?
maninak
7
Observação: flatMap agora é compatível com o nó 11+
JeffMinsungKim
4

Você pode estender a interface do array global enquanto espera pela estabilidade, momento em que ele será adicionado à biblioteca padrão.

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

A resposta de Aaron Beall é excelente. Pode valer a pena saber que, se "lib" não for especificado no arquivo tsConfig.JSON, uma lista padrão de bibliotecas será injetada. As bibliotecas padrão injetadas são: ► Para --target ES5: DOM, ES5, ScriptHost ► Para --target ES6: DOM, ES6, DOM.Iterable, ScriptHost

Em outras palavras: devemos especificar as bibliotecas que foram adicionadas automaticamente anteriormente. (consulte: https://www.typescriptlang.org/docs/handbook/compiler-options.html para mais informações)

"compilerOptions": {

   "target": "es6",

   "lib": [ "es2019", "DOM", "ES6" ,"DOM.Iterable", "ScriptHost"],}
Hector Crean
fonte
2

Para uma matriz plana de nível único

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

Para uma matriz plana de vários níveis

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

para saber mais a fundo você também pode verificar o link abaixo

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

Manoj Rana
fonte