나는 크롬 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
을 추가해야합니다 .--lib
array.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