angular - 在Angular HTTP中自动映射后如何调用对象中的方法?
问题描述
我有模型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 is not a function。
我该如何解决?
解决方案
当您将类型参数传递给get
您时,实际上并没有改变get
内部所做的事情,即从服务器获取数据并将其解析为对象(JSON.parse
最有可能使用)。传递参数的原因是要对来自服务器的对象进行类型化,但该对象实际上不会是类的实例,它仍然是一个简单的对象。为避免这种混淆,您可以使用仅包含字段作为类型参数的接口,并创建User
in的实例subscribe
this.userService.getById(1).subscribe(data => this.user = Object.assign(new User(), data));
或者更安全的方式,确保没有人认为从返回的数据getById
是一个实际的实例User
:
type DataKeys<T> = { [P in keyof T] : T[P] extends Function ? never : P }[keyof T]
type Data<T> = Pick<T, DataKeys<T>>;
getById(id: number) {
return this.http.get<Data<User>>(`/api/v1/admin/users/${id}`);
}
this.userService.getById(1).subscribe(data => this.user = Object.assign(new User(), data));
推荐阅读
- ios - 如何将路线坐标数组划分为等距离部分?
- reactjs - 使用 React.lazy 给出的元素类型无效
- java - 如何将多个服务放在一个类中,该类在 Activiti 中实现 JavaDelegate 接口
- python - sys.argv[0] 总是什么都不返回
- c - 依次出现 fwrite 和 fread 问题
- xml - 如何使用 minidom 正确解析 xml
- java - 我如何将完全标记的数据集拆分为标记和未标记的数据以用于半监督学习
- python - Anaconda unsatisfiederror的Keras安装错误
- excel - Excel:使用IF和Count函数检查列中是否存在日期范围?
- javascript - 古兰经/经典阿拉伯语的语音识别