在Angular HTTP中自动映射后,如何在对象中调用方法?

时间:2018-06-21 08:59:03

标签: angular typescript

我有模型User

export class User {
   id: number;
   roles: Role[];

   hasRole(role: string) { return true; }
}

在我的用户服务中,我使用泛型将响应映射到该模型。

getById(id: number) {
   return this.http.get<User>(`/api/v1/admin/users/${id}`);
}

然后在组件中,我尝试调用hasRole方法:

ngOnInit() {
    this.userService.getById(1).subscribe(data => this.user = data);
}

checkRole() {
   return this.user.hasRole();
}

致电checkRole后,我收到消息:

TypeError:this.user.hasRole不是函数

我该如何解决?

1 个答案:

答案 0 :(得分:1)

当您将类型参数传递给get时,实际上并没有更改get内部所做的事情,即从服务器获取数据并将其解析为对象(使用{{1 }} 最有可能的)。传递参数的原因是要为将来自服务器的对象进行键入,但是该对象实际上不是类的实例,而是仍然是简单的对象。为避免这种混淆,您可以使用仅包含字段作为类型参数的接口,并在JSON.parse

中创建User的实例
subscribe

或更安全的一种类型安全的方法,可以确保没有人认为从this.userService.getById(1).subscribe(data => this.user = Object.assign(new User(), data)); 返回的数据是getById的实际实例:

User