如何在TypeScript中声明一个对象数组?

27

我想指定一个函数,它以对象数组作为参数,但是我没有为对象定义特定的类型(一种“匿名类型”)。

bagTotal = (products) => {
 // function does stuff
}

我明白我可以这样做:

bagTotal = (products: any[]) => {
 // function does stuff
}

但这有点过于宽松,不符合我对TypeScript严格的要求。

products是一个由相同外观的对象组成的数组;所有对象都有名称、价格和描述。

我该如何声明呢?

我想做类似于以下的操作:

bagTotal = (products: [{name: string, price: number, description: string}]) => {
 // function does stuff
}

但这不对。我该怎么声明呢?


你为什么说这不对? - Sergio Escudero
您的解决方案创建了一个元组,其中包含具有给定接口的对象。 - Muhammed Bera Koç
4个回答

69

你离成功只差一步之遥,括号的位置不对:

{name: string, price: number, description: string}[]

你之前的方式并不完全错误,但它表示的是只有一个项目的数组,且该项目必须是这种类型。


我还建议将其提取为接口,这将使该类型可重用,并使代码更易读:

interface Product {
    name: string;
    price: number;
    description: string;
}

const products: Product[];

4
如果项目类型非常大,我会建议使用 Array<T> 的形式:Array<{name: string, price: number, description: string}> - Titian Cernicova-Dragomir
1
我刚刚添加了,其实我会为它提取一个类型的 ;) - Ingo Bürk
@IngoBürk 我稍微编辑了一下我的问题,请看一下。如果你能回答,我可以接受你的答案,谢谢。 - Red Baron
@Red Baron产品在您的界面中仍然是无类型的,那有什么意义呢?此外,我正在回滚该编辑。请不要在收到答案后基本上改变问题。您提出了一个问题,它已经得到了回答。如果有新的问题,请开一个新的问题。 - Ingo Bürk
好的,当系统允许时,我会开一个新的问题并接受这个答案。谢谢。 - Red Baron

6

通用数组类型 Array<elemType> 提供了一种简单的方式来声明对象数组:

bagTotal = (products: Array<{name: string, price: number}>) => {
   ...
}

5

我认为您需要声明类"Product",这样您才能像这样声明一个产品数组:

products: Product[];

并将其作为参数传递,如下所示:

bagTotal = (products: Product[]) => {
 // function does stuff
}

为了创建一个类,你可以新建一个 .ts 文件,并添加以下代码:
export class Product {
  name: String;
  price: Number;
  description: String;
}

希望这有所帮助!

谢谢。


1
如果您要声明特定对象的数组,并且想要指定对象中变量的类型,则应创建一个类来表示该对象,例如:
class Item(){
    name: string;
    description: string;
    etc: any

  constructor() {
    this.name;
    this.description;
    this.etc;
}}

然后您可以将数组指定为项目对象的数组:
itemArray: Array<Item>;

如果对象数组应该是通用的,该怎么办? - zero_cool

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接