【问题标题】:TS2345 error when manipulating array of objects操作对象数组时出现 TS2345 错误
【发布时间】: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


【解决方案1】:
const arr: Array<MyObject> = [{ field: ["alice"] }, { field: ["bob", "charlie"] }];

const result: Array<string> = arr.map(obj => obj.field)
                                 .reduce((a, b) => a.concat(b));

【讨论】:

  • 非常感谢
【解决方案2】:

好吧,结果将是:

["alice", "bob", "charlie"]

当我认为你想要时:

[{fields: ["alice", "bob", "charlie"] }]

这将通过以下方式计算:

[{ fields: arr.reduce((a, b) => a.field.concat(b.field)) }]

【讨论】:

  • 嗯,关键在于拥有一个名称列表的数组与一个包含一个对象的数组,其中一个参数“fields”包含一个名称列表的数组。抱歉,您可能已经在未显示的代码中说明了一些问题。
  • 可以说数组中的对象是模型/类。我不明白这是如何工作的。我试过了。
猜你喜欢
  • 2019-01-23
  • 2017-05-27
  • 2022-11-10
  • 2020-08-09
  • 2016-01-07
  • 2021-09-25
  • 1970-01-01
  • 2021-10-12
  • 1970-01-01
相关资源
最近更新 更多