Angular 2官方示例:强类型json对象数组映射错误

时间:2016-04-01 20:54:16

标签: angular rxjs angular2-http

我无法弄清楚如何将从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

2 个答案:

答案 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)