如何在 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