Typescript Array Map Return Object

If you put it in parenthesis the compiler will treat it as an object literal not a code block:

array.map(val => ({
  key1: val.key1,
  key2: val.key2
}));

A type assertion also works if you have an interface for the object literal (but is not as type safe):

interface IKeys { key1: string; key2: string }
array.map(val => <IKeys>{
  key1: val.key1,
  key2: val.key2
});

As an update to @Titian Cernicova-Dragomir's answer above, it's worth mentioning the as operator (for Type Assertion), especially useful when working with React's TSX(JSX) files, equivalent to the <Type> syntax:

interface IKeys { key1: string; key2: string }
// notice the parentheses, to avoid confusion with a block scope
array.map(val => ({
    key1: val.key1,
    key2: val.key2
} as IKeys));

It was introduced because the angle brackets syntax (<ComponentOrElement>) is reserved for components / JSX Elements.


None of the above options have worked for me with React's TSX files.

This is the code that worked for me:

interface IKeys { key1: string; key2: string }

array.map((val: any): IKeys => ({
    key1: val.key1,
    key2: val.key2
}));