typescript - 投不投

标签 typescript angular

我做了一个简单的 Http 调用:

http.get('/test/data/user.json').
    map(res => <User> res.json()).
    subscribe(user => {
        console.log(typeof user);
        console.log(user);
        console.log(user.getName());
});

user.json 中有以下数据:

{
    "name":"Robert"
}

和以下 User类:

export class User{
    name:string;
    lastName:string;
    getName():string{
        return this.name;
    }
}

问题是我在控制台中得到的结果:

console.log(typeof user);

object

console.log(user);

Object {name: "Robert"}

console.log(user.getName());

Uncaught TypeError: user.getName is not a function

问题

这里的问题是我的对象是一个 object , 不是 User , 因此它不具有所有属性,也没有方法。

还尝试了基于 Promise 的调用和 user.json() as User而不是 <User> res.json()

编辑:与转换为接口(interface)不同,因为接口(interface)没有自己的行为。

最佳答案

如果要使用getName方法,需要在映射响应体时实例化一个新的User对象:

http.get('/test/data/user.json').
  map(res => {
    let body = res.json();
    return new User(body.name, body.lastName);
  })
  subscribe(user => {
    console.log(typeof user);
    console.log(user);
    console.log(user.getName());
  });

User 类将进行如下调整:

export class User{
  constructor(private name:string, private lastName:string) {}

  getName():string{
    return this.name;
  }
}

转换对象不会向现有对象添加方法。响应的 json 方法将使用 JSON.parse 简单地解析响应主体并返回原始对象。

查看此插件:https://plnkr.co/edit/7lKHvArpayrMAzm5Xgk1?p=preview .

关于typescript - 投不投,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36181826/

相关文章:

css - 使 mat-card-image 中的所有图像大小相同但正确缩放

typescript - 按对象键的通用数据

javascript - 如何使用 Multer 磁盘存储选项(NodeJs)读取存储的文件?

javascript - knockoutJS 激活/停用值输入

javascript - ngx-gauge 不显示接收到的数据

javascript - Angular2 可以在 Chrome 中工作,但不能在 Firefox 中工作

angular - 我的 Angular 应用程序的规模(缩放)在生产中单独增加

angular - 从 cellRendererFramework 向父级发送事件

typescript - 如何扩展 Array 类并保留其实现

angular - 无法绑定(bind)到 'items',因为它不是 'virtual-scroller' 的已知属性