将数组类型初始化为对象javascript

将数组类型初始化为对象javascript,javascript,typescript,firebase-realtime-database,angular8,Javascript,Typescript,Firebase Realtime Database,Angular8,我有一个叫做产品的接口 export interface Products{ category: string; imageUrl: string; price: number; title: string; } 我的组件中有一个变量,类型为products array products: Products[]; 我试图将我的响应从我的服务映射到products变量,但是我得到了这种错误类型 '{}[]' is not assignable to type

我有一个叫做产品的接口

 export interface Products{
    category: string;
    imageUrl: string;
    price: number;
    title: string;
 }
我的组件中有一个变量,类型为products array

products: Products[];
我试图将我的响应从我的服务映射到products变量,但是我得到了这种错误类型

'{}[]' is not assignable to type 'Products[]'
我不知道我做错了什么

this.subscription = this.productService
  .getAll()
  .subscribe(
    products =>
      (this.products = products.map(p => ({ ...(p.payload.val() as {}) }))),
  )

在本转让条款中:

this.products = products.map(p => ({
  ...(p.payload.val() as {})
}))
…您正在将
p.payload.val()
转换为类型
{}
,并将其传播到一个空对象中(克隆它?),该对象仍然保持其类型为
{}
。因此,
products.map(…)
的类型为
{}[]
,也称为
Array
。由于
this.products
产品[]
,因此类型不兼容

如果
p.payload.val()
已经是
Product
类型,则无需强制转换任何内容:

this.products = products.map(p => p.payload.val())

// or if you need that cloning stuff...

this.products = products.map(p => ({ ...p.payload.val() }))
如果它不是
Product
类型,则转换为
Product
,而不是
{}

this.products = products.map(p => p.payload.val() as Product)

// or if cloning...

this.products = products.map(p => {
  return { ...p.payload.val() } as Product
});

你的方法是什么?(在地图功能中)对不起,这是个错误。应该是p=>({…p.payload.val(),因为{}}名为
payload
的东西有方法吗?我见过的大多数有效载荷都是普通的数据对象。@gbubemimith
p
是否引用产品?你是在显式地做
as{}
在那里;您的意思是将
作为产品执行
还是在类型可推断的情况下将
作为
子句省略?您基本上是告诉编译器制作一个
{}[]