打字稿flatMap,flat,flatten在any类型上不存在[]


137

我正在使用chrome 70并且chrome确实添加了方法.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 6Typescript ~2.9.2并且已经包含import 'core-js/es7/array';在中polyfills.ts

我的猜测是这些方法没有类型,我曾尝试npm run -dev @types/array.prototype.flatmap但仍未解决。

Answers:


278

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

例:

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

以前,它是esnext或的一部分esnext.array,但现在正式成为ES2019的一部分。


4
是的,我重现了它,并且有效。在这里compilerOptionstsconfig.app.json "lib": [ "es2017", "dom", "esnext.array", ] 谢谢你先生
Haziq '18

4
这没有在我的IDE VSCode中为我解决。有小费吗?
timelf123 '19

3
@ timelf123您是否重新启动了IDE?
布莱恩·艾伦·韦斯特,

1
是否有理由使用"esnext"而不是"esnext.array"
maninak19年

7
注意:节点11+现在支持flatMap
JeffMinsungKim,

4

您可以在等待稳定性时扩展全局数组接口,届时它将被添加到默认库中。

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

4

亚伦·比尔的答案非常好。值得一提的是,如果未在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"],}

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.