任何[]类型都不存在打字稿flatMap,flat,flatten

Haz*_*ziq 52 typescript angular

我正在使用chrome 70和chrome确实添加了方法.flatMap, .flatten, .flat.所以我的代码确实按预期运行.不幸的是,Typescript不喜欢它.

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

我得到的警告是 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但仍未解决.

Aar*_*all 125

您应该添加es2019或者es2019.array--lib设置为打字稿识别array.flat()flatMap().

例:

{
  "compilerOptions": {
    "target": "es5",
    "lib": [
      "es2019"
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)

  • @timelf123 你重新启动了 IDE 吗? (14认同)
  • 这并没有在我的 IDE VSCode 中为我修复它。有小费吗? (9认同)
  • 是的,我重现了它,并且有效。这是我在`tsconfig.app.json``lib中的`compilerOptions`:[“ es2017”,“ dom”,“ esnext.array”,]`谢谢您,先生 (2认同)
  • 注意:节点11+现在支持flatMap (2认同)
  • 我认为在接受的答案下发表评论会更有效。收到错误: string[][] 类型上不存在属性 flat;不应该是扁平类型的 any[] 仍然可以与 string[][] 一起使用。我不知道如何很好地组织这个声明。 (2认同)
  • @maninak `es2019.array` 在大多数情况下是首选,因为它明确指定了项目中支持的 `es2019` 规范的功能,从而避免意外使用不支持的 `es2019` 功能 (2认同)

Man*_*ana 24

扁平化单层阵列

arr.reduce((acc, val) => acc.concat(val), []);
Run Code Online (Sandbox Code Playgroud)

扁平化多级阵列

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

要深入了解,您还可以查看以下链接

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

  • 感谢这个片段 - 它很有帮助,因为即使在接受的答案中修复了 Typescript,我仍然无法使用 `.flat()`。 (2认同)

小智 15

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"],}
Run Code Online (Sandbox Code Playgroud)


小智 8

我尝试了大多数答案,但它们对我不起作用。IDE:VScode

但这确实

npm i -D @types/node
Run Code Online (Sandbox Code Playgroud)