Ketikan skrip flatMap, datar, rata tidak ada pada tipe apapun []

141

Saya menggunakan chrome 70 dan chrome memang menambahkan metode .flatMap, .flatten, .flat. Jadi kode saya berjalan seperti yang diharapkan. Sayangnya, Typecript tidak menyukainya.

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

peringatan yang saya dapatkan adalah TS2339: Property 'flatMap' does not exist on type 'any[]'.

Ngomong-ngomong saya menggunakan Angular 6, yang Typescript ~2.9.2sudah saya gunakan dan sudah saya sertakan import 'core-js/es7/array';di polyfills.ts.

Dugaan saya adalah bahwa tidak ada pengetikan untuk metode ini, dan saya memang mencoba npm run -dev @types/array.prototype.flatmaptetapi masih belum menyelesaikan.

Haziq
sumber

Jawaban:

284

Anda harus menambahkan es2019atau es2019.arrayke --libpengaturan Anda untuk TypeScript untuk mengenali array.flat()dan flatMap().

Contoh:

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

Sebelumnya ini tersedia sebagai bagian dari esnextatau esnext.array, tetapi sekarang secara resmi menjadi bagian dari ES2019.

Aaron Beall
sumber
4
Yup saya mereproduksi ini dan berhasil. Ini saya compilerOptionsdi tsconfig.app.json "lib": [ "es2017", "dom", "esnext.array", ] Terima kasih Pak
Haziq
4
Ini tidak memperbaikinya untuk saya di IDE saya, VSCode. Ada tips?
timelf123
4
@ timelf123 sudahkah Anda memulai ulang IDE?
Brian Allan West
1
Apakah ada alasan (dan jika demikian, apa efeknya) penggunaan "esnext"daripada "esnext.array"?
maninak
7
Catatan: flatMap sekarang didukung di node 11+
JeffMinsungKim
4

Anda dapat memperluas antarmuka larik global sambil menunggu stabilitas, di mana ia akan ditambahkan ke pustaka default.

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

Jawaban Aaron Beall luar biasa. Perlu diketahui bahwa jika "lib" tidak ditentukan dalam file tsConfig.JSON, daftar default library akan dimasukkan. Pustaka default yang dimasukkan adalah: ► Untuk --target ES5: DOM, ES5, ScriptHost ► Untuk --target ES6: DOM, ES6, DOM.Iterable, ScriptHost

Dengan kata lain: Kita harus menentukan libs yang sebelumnya ditambahkan secara otomatis. (lihat: https://www.typescriptlang.org/docs/handbook/compiler-options.html untuk info lebih lanjut)

"compilerOptions": {

   "target": "es6",

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

Ke larik tingkat tunggal datar

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

Untuk larik multi level datar

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

untuk mengetahui lebih dalam Anda juga dapat memeriksa tautan di bawah ini

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

Manoj Rana
sumber