typescript 如何在Angular 模板中迭代联合类型数组

m0rkklqb  于 2022-12-14  发布在  TypeScript
关注(0)|答案(4)|浏览(159)

我是Angular 的新手,开始在版本12上工作,我卡在了一个点上。我想在模板中的联合数组中迭代,但它给了我错误。
错误:类型'IBasketItem[]| IOrderItem[]'无法指派给型别' NgIterable'。
这是我想迭代的组件中的联合数组。

@Input() items: IBasketItem[] | IOrderItem[] = [];

这是模板代码

<tr *ngFor="let item of items" class="border-0">

它会在“of”关键字下显示一条红线,其中包含上述错误
下面是IBasketItem接口

export interface IBasketItem {
id: number;
productName: string;
price: number;
quantity: number;
pictureUrl: string;
brand: string;
type: string;

}
这是IOrderItem接口

export interface IOrderItem {
productId: number;
productName: string;
pictureUrl: string;
price: number;
quantity: number;

}
如果有人提出解决办法,我将不胜感激。

snz8szmq

snz8szmq1#

声明如下类型的数组@Input() items: [IBasketItem | IOrderItem] = [];
这是可以重复的。
或这边
@Input() items: Array<IBasketItem | IOrderItem> = [];

kqlmhetl

kqlmhetl2#

虽然@Hitech的答案可能有用,但您尝试做的事情有点粗略。您必须检查是否有可用的“brand”或“type”属性,然后显示它们,或者对orderItem或basketItem有不同的逻辑。
我建议您为它们提供一个公共接口,然后遍历数组:

export interface IItem {
    id: number;
    productName: string;
    price: number;
    quantity: number;
    pictureUrl: string;
}

export interface IOrderItem extends IItem {
    productId: number; // might be the same with the id from the base class, depending on your logic
}

export interface IBasketItem extends IItem {
    brand: string;
    type: string;
}

@Input() items: IItem[] = [];

或者使用两个单独的数组,并为每个数组使用一个for循环。

@Input() basketItems: IBasketItem [] = [];
@Input() odredItems: IOrderItem [] = [];
vmpqdwk3

vmpqdwk33#

Angular检查应用程序代码中模板内的表达式和绑定。尝试在tsconfig.json文件中设置"strictTemplates": false,应该没问题。

piwo6bdm

piwo6bdm4#

这是一个有趣的错误。我的实习生得到了同样的错误,理解了错误信息,我看到了问题所在。

@Input() items: IBasketItem[] | IOrderItem[] = [];

当你声明一个类型可以是两个不同数组的联合体时,你并没有为两个数组都提供一个数组迭代器,事实上,你为每个可能的数组都提供了一个迭代器,这就是为什么编译器会抛出一个错误,它不知道该使用哪个迭代器.

@Input() items: (IBasketItem | IOrderItem)[] = [];

所以,要解决这个问题,你需要确保你只有一个迭代器,一个联合类型的列表。
关于此解决方案的几点说明:
1.在处理联合类型时,只能直接访问在联合中具有交集的属性,或者应该使用类型保护并处理每个联合类型。

  1. (IBasketItem | IOrderItem)[]允许你有一个混合类型的数组,如果你这样做,编译器不会抛出错误。但通常,你总是接收一个类型数组作为输入。这应该不是问题:)

相关问题