Bản đồ định dạng flatMap, phẳng, phẳng không tồn tại trên bất kỳ loại nào []


138

Tôi đang sử dụng chrome 70 và chrome có thêm các phương thức .flatMap, .flatten, .flat. Vì vậy, mã của tôi không chạy như mong đợi. Thật không may, Typecript không thích nó.

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

cảnh báo tôi nhận được là TS2339: Property 'flatMap' does not exist on type 'any[]'.

Theo cách tôi đang sử dụng Angular 6, cách sử dụng Typescript ~2.9.2và tôi đã đưa import 'core-js/es7/array';vào polyfills.ts.

Tôi đoán là không có cách nhập cho các phương pháp này và tôi đã cố gắng npm run -dev @types/array.prototype.flatmapnhưng vẫn không giải quyết được.

Câu trả lời:


281

Bạn nên thêm es2019hoặc es2019.arrayvào --libcài đặt của mình để TypeScript nhận ra array.flat()flatMap().

Thí dụ:

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

Trước đây, tính năng này đã có sẵn như một phần của esnexthoặc esnext.array, nhưng giờ đây nó chính thức là một phần của ES2019.


4
Đúng, tôi tái tạo cái này và nó hoạt động. Here my compilerOptionsin tsconfig.app.json "lib": [ "es2017", "dom", "esnext.array", ] Thank you sir
Haziq

4
Điều này không khắc phục được nó cho tôi trong IDE, VSCode của tôi. Bất kỳ lời khuyên?
timelf123

3
@ timelf123 bạn đã khởi động lại IDE của mình chưa?
Brian Allan West

1
Có lý do gì (và nếu có thì tác dụng của "esnext"nó là "esnext.array"gì)?
maninak

7
Lưu ý: flatMap hiện đang được hỗ trợ trong nút 11 +
JeffMinsungKim

4

Bạn có thể mở rộng giao diện mảng toàn cục trong khi chờ ổn định, lúc này nó sẽ được thêm vào thư viện mặc định.

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

4

Câu trả lời của Aaron Beall là tuyệt vời. Có thể đáng biết rằng nếu "lib" không được chỉ định trong tệp tsConfig.JSON, danh sách thư viện mặc định sẽ được đưa vào. Các thư viện mặc định được đưa vào là: ► Đối với --target ES5: DOM, ES5, ScriptHost ► Đối với --target ES6: DOM, ES6, DOM.Iterable, ScriptHost

Nói cách khác: Chúng ta phải chỉ định những lib đã được thêm tự động trước đó. (xem: https://www.typescriptlang.org/docs/handbook/compiler-options.html để biết thêm thông tin)

"compilerOptions": {

   "target": "es6",

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.