[angular] typescript flatMap, flat, flatten은 any [] 유형에 존재하지 않습니다.

나는 크롬 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했지만 여전히 해결하지 못했습니다.



답변

TypeScript가 및 을 인식하도록 설정에 es2019또는 es2019.array을 추가해야합니다 .--libarray.flat()flatMap()

예:

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

이전에는 esnext또는의 일부로 제공 esnext.array되었지만 이제 공식적으로 ES2019의 일부입니다.


답변

안정성을 기다리는 동안 전역 배열 인터페이스를 확장 할 수 있습니다. 그러면 기본 라이브러리에 추가됩니다.

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


답변

Aaron Beall의 대답은 훌륭합니다. tsConfig.JSON 파일에 “lib”가 지정되지 않은 경우 기본 라이브러리 목록이 삽입된다는 점을 아는 것이 좋습니다. 삽입되는 기본 라이브러리는 다음과 같습니다. ► –target ES5의 경우 : DOM, ES5, ScriptHost ► –target ES6의 경우 : DOM, ES6, DOM.Iterable, ScriptHost

즉, 이전에 자동으로 추가 된 라이브러리를 지정해야합니다. ( 추가 정보는 https://www.typescriptlang.org/docs/handbook/compiler-options.html 참조 )

"compilerOptions": {

   "target": "es6",

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


답변

플랫 단일 레벨 어레이

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


답변