'Property 'map' does not exist on type Object

type MyStructure = Object[] | Object;

const myStructure: MyStructure = [{ foo: "bar" }];

myStructure.map(); // Property 'map' does not exist on type 'MyStructure'. any

The library either delivers an object or an array of this object. How can I type this?

EDIT

And how can I access properties like myStructure["foo"] in case of myStructure will be an object?



Solution 1:[1]

Because your type means you could have an object, or you could have an array; TypeScript can't determine which members are appropriate.

To test this out, change your type and you'll see the map method is now available:

type MyStructure = Object[];

In your case, the actual solution will be to use a type guard to check that you have an array before attempting to use the map method.

if (myStructure instanceof Array) {
    myStructure.map((val, idx, []) => { });
}

You could also solve your problem using a slightly different definition of MyStructure, for example:

type MyStructure = any[] | any;

Or the narrower:

class Test {
    foo: string;
}

type MyStructure = Test[] | Test;

Solution 2:[2]

Even I faced this issue of 'Property 'map' does not exist on type Object' while I was trying to use .map() on non-iterable codes.. in my case I was using map on JSON object coming from an API to convert its keys i.e category into string[] but was constantly getting this error

JSON data coming from API -> {
  {
     id:1,
     category:'cat-1'
  },
  {
     id:2,
     category:'cat-2'
  }

}

Then I used the JSON methods as

objFromAPI = http.get('someUrl');
categoryList: string[] = JSON.parse(JSON.stringify(objFromAPI)).map(data => data.category);

And hence I was able to iterate on the parsed object as JSON methods converted it to an array

Solution 3:[3]

In a similar case I saw map doesn't exist on type. I had the following code:

export interface Categories {
    authors: {
        _key: string
        name: string
    }[]
}

and then that was going to another interface

....
categories: Categories

The solution was to alter the main to contain just a single one as

    categories: Category[]

with

    export interface Category {
        _key: string
        name: string
}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2 EnthuCoder
Solution 3