我无法弄清楚如何将从Web服务返回的json对象数组映射到Angular 2应用程序中正确键入的对象数组。
正如你在Angular 2的plunker官方例子中所看到的,预期的对象不是Hero类型,它们是Object类型和Hero:Hero []成员HeroListComponent实际上是一个Object []。您可以在控制台中看到阵列没有强类型:
http://plnkr.co/edit/Qa22yzPh3JWI8lNZ99Ik?p=preview
我添加了额外的console.log()调用添加英雄命令,你可以在浏览器控制台中看到我们没有Hero []但是Object []。
显然,转换不起作用:
this.http.get(this._heroesUrl)
.map(res => <Hero[]> res.json().data)
.catch(this.handleError);
我们得到Object []而不是Hero []。
关于如何将json映射到正确键入的对象的任何想法?
更多信息: https://angular.io/docs/ts/latest/guide/server-communication.html
答案 0 :(得分:3)
您的浏览器正在运行JavaScript,可能是ES5,而不是TypeScript。在TypeScript中,可以为数组提供类型定义,但在JavaScript中,数组是对象数组。您可以在其中放置任何内容,但不会输入。
在ES6中有typed arrays,但它们实际上不是数组,而是处理二进制数据的对象。
TypeScript表示法(type assertion)仅供编译器检查是否使用对象数组,就好像它只包含Hero
个对象或兼容对象一样,仅此而已。它不会在运行时强制执行,也不会发出任何代码。
答案 1 :(得分:3)
Angular 2 observable doesn't 'map' to model
如上面链接中的重复问题所示,从json对象自动映射到您自己的打字稿类仍然是一个手动过程....
我真的以为Typescript会非常聪明,以便在map()调用结束时获取Hero对象。
在这样的电话结束时,应该有一种更简单的方法来获取Hero []: .map(res =&gt; res.json()。data)