Search code examples
typescriptvariable-types

Why I can't call keys() on a Typescript Map?


In a Typescript program (3.9.6), I have a variable p that I believe to be a Map. From console.log(p) I get:

Map(2) { 'A' => 0, 'B' => 2}

However, it looks like I can't get the keys: console.log(p.keys()) cannot even compile:

 error TS2349: This expression is not callable.
 Type 'Number' has no call signatures.
 console.log(p.keys());

The variable p seems to come from here:

function f(q: IQ){
   ...
   let p=q.data;
   console.log(p);
   console.log(p.keys());
   ...

where IQ is defined as

export interface IQ {
   data: IData;
}
export interface IData {
     [key: string]: number
}

No idea what is wrong, I'm stuck


Solution

  • p is of type IData, not Map (or at least that is how TypeScript sees it at compile time).

    If it is really an IData at runtime, use Object.keys(p) to get the keys.

    If it is really a Map, you can cast it like console.log((p as any as Map<string, number>).keys()). However, this means that the types are incorrect and it is better to fix the types instead of casting.