【发布时间】:2016-12-15 22:16:44
【问题描述】:
假设我有一个看起来像这样的数组:
let arr = [{field: ["alice"]}, {field : ["bob", "charlie"]}
我希望能够在不编写嵌套 for 循环的情况下连接所有值。
到目前为止,我已经这样做了:
arr.reduce((a, b) => a.field.concat(b.field))
问题,正如我所看到的,数组的类型,比如说arr : Array<MyObject>,在映射或类似的东西时发生了变化。
我收到 TS2345 错误
...不能分配给类型参数...
为了清楚起见,结果应该与以下结果相同。
let result = [];
for (let i = 0; i < arr.length; i++) {
for (let j = 0; j < arr[i].field.length; j++) {
result.push(arr[i].field[j])
}
}
抱歉,我无法分享我的真实代码,但这正是问题所在。 出于某种原因,这适用于 Chrome 的开发人员工具,但在我尝试编译代码时不起作用。
【问题讨论】:
-
澄清一下,您添加的 for 循环已经过验证可以正常工作,对吗?问题只是TS编译reduce函数以同样的方式工作?
-
循环有效,是的。导致问题的原因是在一次连接之后,数组 [0] 的类型与其他类型不同,因此下一次 reduce 调用根本不会是类型安全的。通过之前使用 Map,我们将每个项目选择为所需的类型,然后在所有项目上调用一个函数
标签: javascript arrays typescript