在TypeScript中展平数组

时间:2019-06-11 13:12:46

标签: angular typescript

我想将string[][]拼合为string[]

数十种SO答案中给出的建议是:[].concat(...arrays)

但这给了我这个错误:

  

'string []'类型的参数不能分配给'ConcatArray'类型的参数。
    属性“ slice”的类型不兼容。
      类型'(开始?:数字|未定义,结束?:数字|未定义)=>字符串[]'不能分配给类型'(开始?:数字|未定义,结束?:数字|未定义)=> never []' 。
        类型'string []'不能分配给类型'never []'。
          不能将“字符串”类型分配给“从不”类型。

我尝试的另一种方法是:

let foo: string[][] = [["a", "b", "c"], ["a", "b", "c"], ["a", "b", "c"]];
let bar = [].concat(...foo);

哪个给出类似的错误:

  

'string []'类型的参数不能分配给'ConcatArray'类型的参数。

为什么对我以外的所有人都有效?

7 个答案:

答案 0 :(得分:3)

您可以使用flat()

展平数组
let foo: string[][] = [["a", "b", "c"], ["a", "b", "c"], ["a", "b", "c"]];
let bar = foo.flat()

日志

console.log(bar)   // a,b,c,a,b,c,a,b,c 

更新

通过将类型更正为string [],您还可以使用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])

答案 1 :(得分:3)

这是一个通用的解决方案:

function flatten<T>(arr: T[][]): T[] {
  return ([] as T[]).concat(...arr);
}

答案 2 :(得分:2)

.flat()也会给出类型错误。 您可以使用泛型来解决此问题

my $from = '';
my $to   = '';

# And then, in the loop...

$from .= $conv[0];
$to   .= $conv[1];

# And later still...

my $statement = "\$line =~ tr/$from/$to/";

无论哪种方式,您都可以打电话。只是知道您的类型声明不正确。

答案 3 :(得分:1)

代码

const res = [].concat(...foo);

应该工作。我猜这是tsconfig中的配置错误,导致您遇到该错误。确保tsconfig的es2015数组中至少有es2018(更好的lib)。要使新的flat如kokodoko所示工作,请确保还添加esnext

"lib": [
  "es2018",
  "dom",
  "esnext"
]

答案 4 :(得分:1)

尝试一下:

const a = [["a", "b", "c"], ["a", "b", "c"], ["a", "b", "c"]]
const result = a.reduce((accumulator, value) => accumulator.concat(value), []);
console.log(result)

答案 5 :(得分:1)

我相信您有strictNullCheck:是

在strictNullChecks下,将没有上下文类型的空数组([] .concat(arg)中的[])推断为never []。并且永远不能从任何其他类型分配。

([[as as any [])。concat(foo);应该可以解决问题

答案 6 :(得分:0)

这是最简单的选项:

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

就像@Kokodoko的方法一样,但内联了键入内容。