我正在使用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
,并且我已经在import 'core-js/es7/array';
中包括了polyfills.ts
。
我的猜测是这些方法没有类型,我确实尝试过npm run -dev @types/array.prototype.flatmap
,但仍然无法解决。
答案 0 :(得分:36)
您应将esnext
或esnext.array
添加到--lib
设置中,以便TypeScript识别array.flat()
和flatMap()
。
示例:
{
"compilerOptions": {
"target": "es5",
"lib": [
"esnext"
]
}
}
答案 1 :(得分:8)
亚伦·比尔的答案非常好。值得一提的是,如果未在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"],}
答案 2 :(得分:5)
到平坦的单级数组
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
答案 3 :(得分:1)
您可以在等待稳定性时扩展全局数组接口,届时它将被添加到默认库中。
interface Array<T> {
flat(): Array<T>;
flatMap(func: (x: T) => T): Array<T>;
}
答案 4 :(得分:0)
您也可以将 esnext
添加到您的 --lib 而不是 'es2019'
"compilerOptions": {
"target": "es2015",
"lib": ["dom", "esnext"]
}
它对我有用。
答案 5 :(得分:0)
从 angular 11 和 thx 到 typescript 3.9,这是现在的新配置。
"compilerOptions": {
"target": "es2018",
"module": "es2020",
"lib": ["es2020", "dom"],
}
es2020
而不是 esnext
?在 TypeScript 3.9 中,模块控制的 TypeScript 编译器的行为与“esnext”和“es2020”值相同。这种行为将来可能会发生变化,因为“esnext”选项可能会以向后不兼容的方式发展,从而导致在 TypeScript 更新期间出现构建时或运行时错误。因此,代码可能会变得不稳定。使用“es2020”选项可以降低这种风险。
答案 6 :(得分:-1)
我收到此错误的原因是我正在使用旧版本的节点(10)
安装11+版本将解决此问题。