开发者问题收集

如何在 Typescript 中初始化一个空对象数组?

2022-08-12
6020

我已获取一组数据文档,并循环遍历它们以从每个名为“Item”的对象中创建对象;每个 Item 对象都有一个“amount”键和一个“id”键。

我需要将每个创建的 Item 对象附加到名为“Items”的数组中。但是,当我在顶部创建此数组(当前像这样: var itemObjects: [Item] )然后将每个项目推送到数组时,如下所示:

snapshot.forEach((doc: any) => {
let docData = doc.data()
let items = docData.items
items.forEach((item: any) => {
  let itemObject = new Item(item.amount, item.transactionType)
  console.log("converted item to Item Object:", itemObject)
  itemObjects.push(itemObject)
})

它给了我这个错误:未处理的错误 TypeError:无法读取未定义的属性(读取“推送”)\n

我认为我错误地初始化了顶部的变量数组。任何帮助都非常感谢。

编辑 - 另一段代码(用于 Item 类)是:

interface IItem {
amount: number
id: string
}

export class Item implements IItem {
 amount: number
 id: string

 constructor(amount: number, id: string) {
  this.amount = amount
  this.id = id
  }
 }
2个回答

您没有 初始化 变量,只是 声明 了它。TypeScript 删除类型注释后,生成的 JavaScript 中只剩下:

var itemObjects

因此只需为其赋值:

var itemObjects: Item[] = []
                        ^^^^

另一个问题(上面也已修复)是​​ [Item] 是单个 Item 元组 。在运行时它只是一个数组,但您无法创建一个包含多于或少于一个 Item 的数组。相反,请使用 Item[] 来表示项目数组。

Thomas
2022-08-12

您可以像下面这样声明一个类型化数组:

var items = new Array<Item>();

var items: Item[] = [];

这两种方式都会给您完全相同的行为。

顺便问一下,为什么不直接使用 map 函数而不是 forEach?

var items = docs.map((item: any) => new Item(item.amount, item.id));
dpimonov
2022-08-12