类型any中不存在flatMap, flat, flatten []

我使用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 6,它使用Typescript ~2.9.2,并且我已经在polyfills.ts中包含了import 'core-js/es7/array';

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

150188 次浏览

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

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

你应该在你的--lib设置中添加es2019es2019.array,以便TypeScript能够识别array.flat()flatMap()

例子:

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

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

Aaron Beall的回答非常棒。如果在tsConfig中没有指定"lib",可能值得知道。JSON文件一个默认库列表被注入。注入的默认库是: ►目标ES5: DOM,ES5,ScriptHost ►目标ES6: DOM,ES6,DOM。Iterable, ScriptHost < / p >

换句话说:我们必须指定以前自动添加的那些库。(更多信息见:https://www.typescriptlang.org/docs/handbook/compiler-options.html)

"compilerOptions": {


"target": "es6",


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

如果你的版本比es2019低,你可以实现一个shim来提供类似于后续库提供的.flat().flatMap()的功能。

到平坦的单层阵列

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

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

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

这对我很管用。

从angular 11开始,直到打字稿3.9,这是新的配置。

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

为什么是es2020而不是esnext?

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

< a href = " https://angular。Io /guide/migration-update-module-and-target-compiler-options" rel="nofollow noreferrer">for further read

我试了大部分答案,都不适合我。 IDE: VScode < / p >

但这确实是

npm i -D @types/node