typescript - 将对象数组映射到 typescript 中具有不同对象的另一个数组

标签 typescript

如果我有类似的东西

array1: string[] = ['foo', 'bar'];

和一个界面
export interface MyObject { name: string; }

如何将 array1 映射到另一个 MyObject 类型的数组?
array2 : MyObject[];
array2 = array1.map(s => ...);

我想过类似的事情
array2 = array1.map<MyObject>(s => new MyObject(...));

最佳答案

这通常是我离题的地方 long lecture关于 TypeScript 中类型和值之间的区别,但在这里我会尽量简短:因为 MyObject只知道是一个类型而不是构造函数值,你不能调用 new MyObject() .相反,如果你想创建一个 MyObject 类型的值,你可以只使用一个普通的旧对象 of the right shape ,例如通过 object literal notation :

const myObject: MyObject = {name: "Alice"}; // no error

所以你的 map函数可以如下:
const array2: MyObject[] = array1.map(s => ({name: s})); // no error

很简单吧?

呃,好吧,请注意上面的评论中 {name: s} 周围的括号是 necessary ,因为无论好坏,JavaScript 解析器都会解释形式 (x => {...}) 的箭头函数因为有 block body花括号里面的东西是语句。而当你解释name: s作为声明,这意味着 namelabel , 和 s只是一个字符串 expression statementoptional semicolon omitted .解释为函数体,{name: s}只是评估 s并且不返回定义的值(它是 void ,它本质上与 undefined 相同),这就是为什么如果省略括号会出现以下奇怪的错误:
let array2: MyObject[] = array1.map(s => { name: s }); // error!
// Type 'void[]' is not assignable to type 'MyObject[]'.
// at runtime, array2 will be [undefined, undefined] which is not what you wanted 🙁

JavaScript 解析这种方式有点棘手。添加括号使 s => (...)修复它。现在箭头后面的东西只能解释为 concise body ... 即,单个表达式。和口译({name: s})作为表达式产生我们想要的对象字面量。

是的,我避免写一本关于类型和值的书,最终以某种方式写了一本关于表达式和语句的不同的书。那好吧。

希望能帮到你。祝你好运!

关于typescript - 将对象数组映射到 typescript 中具有不同对象的另一个数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54352057/

相关文章:

Angular Material Table - 如何更新现有表格的列标题?

angular - 如何迭代 Angular 5 组件中的对象

javascript - 如何通过代码清理使动态导入/需要依赖于变量?

typescript - 在 TypeScript 中将父类(super class)型断言为泛型参数

Angular 6 升级 : debounceTime is not property of Subject

javascript - Jest 期望模拟函数被调用

typescript :T 扩展字符串 |数字=字符串?

javascript - 如何告诉 typescript {类型:enum, [类型: string]:value} are in my type?的所有可能组合

typescript - 类型错误 : Cannot read property 'length' (typescript/Observable/angular2)

javascript - 合并两个对象然后过滤不起作用