我使用的是Chrome 70和Chrome添加方法。flatmap,。flatten,。flat。所以我的代码按预期运行。不幸的是,TypeScript不喜欢它。

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

我得到的警告是TS2339:属性“flatMap”在类型“any[]”上不存在。

我使用的是Angular 6,它使用Typescript ~2.9.2,并且我已经包含了import 'core-js/es7/array';在polyfills.ts。

我的猜测是这些方法没有类型,我确实尝试npm运行-dev @types/array.prototype。平面地图,但仍然没有解决。


当前回答

Aaron Beall的回答非常好。如果在tsConfig中没有指定"lib",可能值得知道。JSON文件一个默认库列表被注入。注入的默认库是: ►目标ES5: DOM,ES5,ScriptHost ►目标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"],}

其他回答

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

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

您应该添加es2019或es2019。为TypeScript识别array.flat()和flatMap()设置。

例子:

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

以前,这可以作为esnext或esnext的一部分。数组,但它现在正式成为ES2019的一部分。

Aaron Beall的回答非常好。如果在tsConfig中没有指定"lib",可能值得知道。JSON文件一个默认库列表被注入。注入的默认库是: ►目标ES5: DOM,ES5,ScriptHost ►目标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"],}

你也可以在你的——lib中添加esnext而不是'es2019'

"compilerOptions": {
    "target": "es2015",
    "lib": ["dom", "esnext"]
}

这对我很管用。

从angular 11和thx到typescript 3.9,这现在是新的配置。

"compilerOptions": {
    "target": "es2018",
    "module": "es2020",
    "lib": ["es2020", "dom"],
}

为什么是2020年而不是明年?

在TypeScript 3.9中,模块控制的TypeScript编译器的行为与"esnext"和"es2020"值是相同的。这种行为将来可能会改变,因为“esnext”选项可能会以向后不兼容的方式演变,导致在TypeScript更新期间出现构建时或运行时错误。因此,代码可能变得不稳定。使用“es2020”选项可以降低这种风险。

欲进一步阅读