我想将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'类型的参数。
为什么对我以外的所有人都有效?
答案 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的方法一样,但内联了键入内容。