Typescript flatMap, flat, flatten non esiste sul tipo any []


141

Sto usando Chrome 70 e Chrome aggiunge metodi .flatMap, .flatten, .flat. Quindi il mio codice funziona come previsto. Sfortunatamente, Typescript non piace.

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

l'avvertimento che ho ricevuto è TS2339: Property 'flatMap' does not exist on type 'any[]'.

Tra l'altro sto usando Angular 6, quale uso Typescript ~2.9.2e già includo import 'core-js/es7/array';in polyfills.ts.

La mia ipotesi è che non ci sia digitazione per questi metodi e ho provato a farlo, npm run -dev @types/array.prototype.flatmapma non ho ancora risolto.

Risposte:


286

È necessario aggiungere es2019o es2019.arrayalle --libimpostazioni affinché TypeScript riconosca array.flat()e flatMap().

Esempio:

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

In precedenza era disponibile come parte di esnexto esnext.array, ma ora fa ufficialmente parte di ES2019.


4
Sì, riproduco questo e funziona. Qui il mio compilerOptionsin tsconfig.app.json "lib": [ "es2017", "dom", "esnext.array", ] Grazie signore
Haziq

4
Questo non lo ha risolto per me nel mio IDE, VSCode. Qualche consiglio?
timelf123

4
@ timelf123 hai riavviato il tuo IDE?
Brian Allan West

1
C'è una ragione (e se sì qual è l'effetto) di usare "esnext"invece di "esnext.array"?
maninak

7
Nota: flatMap è ora supportato nel nodo 11+
JeffMinsungKim

4

È possibile estendere l'interfaccia dell'array globale mentre si attende la stabilità, a quel punto verrà aggiunta alla libreria predefinita.

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

4

La risposta di Aaron Beall è eccellente. Può valere la pena sapere che se "lib" non è specificato nel file tsConfig.JSON, viene inserito un elenco predefinito di librerie. Le librerie predefinite inserite sono: ► Per --target ES5: DOM, ES5, ScriptHost ► Per --target ES6: DOM, ES6, DOM.Iterable, ScriptHost

In altre parole: dobbiamo specificare quelle librerie che sono state precedentemente aggiunte automaticamente. (vedi: https://www.typescriptlang.org/docs/handbook/compiler-options.html per ulteriori informazioni)

"compilerOptions": {

   "target": "es6",

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.