打字稿数组映射返回对象

Dan*_*ahn 22 typescript

我有以下代码.

array.map(val => { return {
  key1: val.key1,
  key2: val.key2
}});
Run Code Online (Sandbox Code Playgroud)

有没有办法将代码减少到这样的东西?

array.map(val => {
  key1: val.key1,
  key2: val.key2
});
Run Code Online (Sandbox Code Playgroud)

Tit*_*mir 48

如果将其放在括号中,编译器会将其视为对象文字而不是代码块:

array.map(val => ({
  key1: val.key1,
  key2: val.key2
}));
Run Code Online (Sandbox Code Playgroud)

如果您有对象文字的接口(但不是类型安全的),则类型断言也有效:

interface IKeys { key1: string; key2: string }
array.map(val => <IKeys>{
  key1: val.key1,
  key2: val.key2
});
Run Code Online (Sandbox Code Playgroud)

  • 如果使用 React JSX 编译器,请注意使用 &lt;IKeys&gt; 样式类型断言,因为它与 JSX 语法有歧义,因此您必须使用 {...} 作为 IKeys 转换语法。 (2认同)
  • 在`=&gt;`之后的@Cyber​​Mew和`{`总是被解释为一个代码块,没有例外。但是在`=&gt;`之后我们可以有任何表达式,包括括号表达式`(...)`,在这个新表达式内部我们可以有一个对象常量,但是`(...)`没有任何其他方式更改对象表达式的含义。类型断言“ &lt;IKey&gt;”具有类似的功能,它将在“ =&gt;”之后引入一种新的表达式类型,而不是具有始终表示代码块的“ {”。希望这可以使它更加清晰 (2认同)

kur*_*tko 17

对于 React 的 TSX 文件,上述选项都不适合我。

这是对我有用的代码:

interface IKeys { key1: string; key2: string }

array.map((val: any): IKeys => ({
    key1: val.key1,
    key2: val.key2
}));
Run Code Online (Sandbox Code Playgroud)

  • 与“as IKeys”不同,这是唯一完全类型安全的解决方案 (2认同)

ell*_*kie 9

作为上面@Titian Cernicova-Dragomir 回答的更新,值得一提的是as操作符(用于类型断言),在处理 React 的 TSX(JSX) 文件时特别有用,相当于<Type>语法:

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));
Run Code Online (Sandbox Code Playgroud)

引入它是因为尖括号语法 ( <ComponentOrElement>) 是为组件/ JSX 元素保留的。