28

I would like to specify a function that takes an array of objects as a parameter, but I don't have a particular type defined for the object (a sort of "anonymous type")

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

I understand I can do this:

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

but this is a bit more relaxed then what I want: to be strict with typescript.

products is an array of the same-looking objects; all objects have a name, a price and a description.

how can I declare that?

I want to do something like

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

but that's not right. How can I declare this?

2
  • Why did you say it is not right ? Commented Dec 28, 2018 at 21:59
  • Your solution creates a tuple consisting of an object with a given interface. Commented Jul 27, 2021 at 20:06

4 Answers 4

71

You're almost there, the placement of the brackets is just wrong:

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

The way you had it isn't entirely wrong, but it means something else: it means an array with exactly one item of this type.


I'd also recommend extracting it to an interface, it'd make the type reusable and the thing easier to read:

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

const products: Product[];
Sign up to request clarification or add additional context in comments.

5 Comments

I would recommend using the Array<T> form if the item type is very large : Array<{name: string, price: number, description: string}>
I just added that I'd actually extract a type for it anyway ;)
@IngoBürk I slighted edited my question. please see. I can accept your answer if you answer that, thanks
@Red Baron products in your interface is still untyped, so what's the point? Also I'm rolling back that edit. Please don't change the question fundamentally after receiving answers. You asked a question, it has been answered. For a new question please open a new question.
ok I'll open a new question when it allows me too and accept this one. thanks
6

The generic array type Array<elemType> provides a straightforward way to declare an array of objects:

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

Comments

5

I think you must declare the class "Product" so you can declare a Product array like this:

products: Product[];

and pass it as a parameter like this:

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

To have the class you can do a new .ts file with this code:

export class Product {
  name: String;
  price: Number;
  description: String;
}

I wish that helped!

Thank you.

Comments

1

If you are declaring an array of a specific object and want to specify type for variables in the objects, I would create a class for the object like this:

class Item(){
    name: string;
    description: string;
    etc: any

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

Then you can specify the array as an array of item objects:

itemArray: Array<Item>;

1 Comment

What if the array of objects should be generic?

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.