typescript flatMap, flat, flatten ไม่มีอยู่ในประเภทใด ๆ []


142

ฉันใช้โครเมี่ยม 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แต่ก็ยังไม่สามารถแก้ไขได้

คำตอบ:


291

คุณควรเพิ่มes2019หรือes2019.arrayที่คุณ--libตั้งค่าสำหรับ typescript ที่จะรับรู้และarray.flat()flatMap()

ตัวอย่าง:

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

ก่อนหน้านี้มีให้บริการเป็นส่วนหนึ่งของesnextหรือesnext.arrayแต่ตอนนี้เป็นส่วนหนึ่งของ ES2019 อย่างเป็นทางการ


4
ใช่ฉันทำซ้ำสิ่งนี้และใช้งานได้ นี่ฉันcompilerOptionsในtsconfig.app.json "lib": [ "es2017", "dom", "esnext.array", ] ขอบคุณครับ
Haziq

4
สิ่งนี้ไม่ได้แก้ไขให้ฉันใน IDE, VSCode ของฉัน เคล็ดลับใด ๆ
timelf123

4
@ timelf123 คุณรีสตาร์ท IDE หรือไม่
Brian Allan West

1
มีเหตุผล (และถ้าเป็นเช่นนั้นผล) ในการใช้"esnext"แทน"esnext.array"หรือไม่?
maninak

7
หมายเหตุ: ขณะนี้ flatMap ได้รับการสนับสนุนในโหนด
11+ แล้ว

4

คุณสามารถขยายอินเทอร์เฟซอาร์เรย์ส่วนกลางได้ในขณะที่คุณรอความเสถียรเมื่อถึงจุดนั้นจะถูกเพิ่มลงในไลบรารีเริ่มต้น

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

4

คำตอบของ Aaron Beall นั้นยอดเยี่ยมมาก อาจคุ้มค่าที่จะทราบว่าหากไม่ได้ระบุ "lib" ในไฟล์ tsConfig.JSON รายการไลบรารีเริ่มต้นจะถูกแทรกเข้าไป ไลบรารีเริ่มต้นที่แทรกคือ: ►สำหรับ - เป้าหมาย ES5: DOM, ES5, ScriptHost ►สำหรับ - เป้าหมาย ES6: DOM, ES6, DOM.Iterable, ScriptHost

กล่าวอีกนัยหนึ่ง: เราต้องระบุ libs ที่เคยเพิ่มโดยอัตโนมัติ (ดู: 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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.