我是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;
}
如果有人提出解决办法,我将不胜感激。
4条答案
按热度按时间snz8szmq1#
声明如下类型的数组
@Input() items: [IBasketItem | IOrderItem] = [];
这是可以重复的。
或这边
@Input() items: Array<IBasketItem | IOrderItem> = [];
kqlmhetl2#
虽然@Hitech的答案可能有用,但您尝试做的事情有点粗略。您必须检查是否有可用的“brand”或“type”属性,然后显示它们,或者对orderItem或basketItem有不同的逻辑。
我建议您为它们提供一个公共接口,然后遍历数组:
或者使用两个单独的数组,并为每个数组使用一个for循环。
vmpqdwk33#
Angular检查应用程序代码中模板内的表达式和绑定。尝试在
tsconfig.json
文件中设置"strictTemplates": false
,应该没问题。piwo6bdm4#
这是一个有趣的错误。我的实习生得到了同样的错误,理解了错误信息,我看到了问题所在。
当你声明一个类型可以是两个不同数组的联合体时,你并没有为两个数组都提供一个数组迭代器,事实上,你为每个可能的数组都提供了一个迭代器,这就是为什么编译器会抛出一个错误,它不知道该使用哪个迭代器.
所以,要解决这个问题,你需要确保你只有一个迭代器,一个联合类型的列表。
关于此解决方案的几点说明:
1.在处理联合类型时,只能直接访问在联合中具有交集的属性,或者应该使用类型保护并处理每个联合类型。
(IBasketItem | IOrderItem)[]
允许你有一个混合类型的数组,如果你这样做,编译器不会抛出错误。但通常,你总是接收一个类型数组作为输入。这应该不是问题:)