Angular 展平TypeScript中的数组数组

Angular 展平TypeScript中的数组数组,angular,typescript,Angular,Typescript,我想将string[][]展平为string[] 几十个SO答案中给出的建议是:[].concat(…数组) 但这给了我一个错误: “string[]”类型的参数不能分配给“ConcatArray”类型的参数。 属性“切片”的类型不兼容。 类型'(开始?:编号|未定义,结束?:编号|未定义)=>string[]”不可分配给类型'(开始?:编号|未定义,结束?:编号|未定义)=>never[]”。 类型“string[]”不可分配给类型“never[]”。 类型“string”不可分配给类型“ne

我想将
string[][]
展平为
string[]

几十个SO答案中给出的建议是:
[].concat(…数组)

但这给了我一个错误:

“string[]”类型的参数不能分配给“ConcatArray”类型的参数。
属性“切片”的类型不兼容。
类型'(开始?:编号|未定义,结束?:编号|未定义)=>string[]”不可分配给类型'(开始?:编号|未定义,结束?:编号|未定义)=>never[]”。
类型“string[]”不可分配给类型“never[]”。
类型“string”不可分配给类型“never”

我尝试的另一种方法是:

let foo: string[][] = [["a", "b", "c"], ["a", "b", "c"], ["a", "b", "c"]];
let bar = [].concat(...foo);
这会产生类似的错误:

“string[]”类型的参数不能分配给“ConcatArray”类型的参数


为什么它适用于除我以外的所有人?

您可以使用
flat()

日志

更新

通过将类型更正为字符串[],您还可以使用
concat

let foo: string[][] = [["a", "b", "c"], ["a", "b", "c"], ["a", "b", "c"]];
let bar : string[] = []
bar = bar.concat(foo[0], foo[1], foo[2])
代码

const res = [].concat(...foo);
应该有用。我猜是tsconfig中的错误配置导致了这个错误。确保tsconfig的
lib
数组中至少有
es2015
(更好的
es2018
)。要使新的
flat
如kokodoko所示工作,请确保同时添加
esnext

"lib": [
  "es2018",
  "dom",
  "esnext"
]
.flat()还将给出类型错误。 您可以使用泛型来解决这个问题

let st:string[][[]
设bar=[].concat(…st);
console.log(bar)
尝试以下操作:

const a=[[“a”、“b”、“c”]、[“a”、“b”、“c”]、[“a”、“b”、“c”]]
const result=a.reduce((累加器,值)=>累加器.concat(值),[]);

console.log(结果)
以下是最简单的选项:

let bar = ([] as string[]).concat(...foo);

就像@Kokodoko的方法,但打字是内联的。

我相信你已经检查过了:真的

没有上下文类型([].concat(arg))的空数组在strictNullChecks下被推断为never[]。而且从不可从任何其他类型分配


([]如任何[])。concat(foo);应该这样做

这里有一个通用的解决方案:

function flatten<T>(arr: T[][]): T[] {
  return ([] as T[]).concat(...arr);
}
函数展平(arr:T[]):T[]{
返回([]作为T[])。concat(…arr);
}

类型“string[][]”上不存在提供属性“flat”的
`@lonix您需要在tsconfig中将
esnext
添加到
libs
,以使这项工作现在一切正常,这是有意义的:-)但我排除了这一点,因为有一个原因,在它成为最新版本之前,我不会使用任何前沿。如果现在就有这个功能就好了!我添加了一个使用concat的选项,您必须将
bar
的类型指定为
string[]
而不是
string[][]
我认为这是使用最新功能的人的最佳答案,不幸的是,我需要使用旧的for循环!)这可以在不使用esnext库的情况下工作。在es2017上为我工作。对于那些想要瞄准更广泛的浏览器的人来说,这是最好的选择。谢谢
let bar = ([] as string[]).concat(...foo);
function flatten<T>(arr: T[][]): T[] {
  return ([] as T[]).concat(...arr);
}