在我的有角项目中,我有一个方法从后端返回User类:
export class User {
id: string;
name: string;
my_list: Array<string>;
get otherNameForMyList() : Array<string> {
return this.my_list;
}
set otherNameForMyList(newList : Array<string>) {
this.my_list = newList;
}
}
所以我这样称呼后端:
export class UserService {
getUserFromBE(login: string): Observable<User> {
return this.http
.get<User>(`${environment.apiUrl}/user/${login}`)
.pipe(catchError(this.processHTTPMsgService.handleError));
}
}
但是当我调用此方法并订阅结果时,我不能使用otherNameForMyList:
let user = new User();
userService.getUserFromBE('mylogin').subscribe(async (u : User)=>{
console.log(u.otherNameForMyList); // undefined
}
但是,如果我这样操作的话:
let user = new User();
userService.getUserFromBE('mylogin').subscribe(async (u : User)=>{
console.log(u.my_list); // ok result
}
也console.log(u)返回对象类型,而不是应该的用户类型。
现在,如果我在getUserFromBE中的httpclient调用中将结果类型声明为“:Observable”,那么您不应该是User类型吗?我可以强迫它成为吗?
很明显,api仅返回my_list字段。
任何人都可以解释一下为什么u是Object而不是User吗?
谢谢
HttpClient
上的通用方法将对反序列化的json结果使用类型断言。示例:.get<User>
仍将返回一个对象,但是现在可以在静态代码中使用类型断言来将返回的实例视为User
。它确实not表示返回的实例的类型为User
。
如果需要User
的实际实例,则应使用map
并创建User
的实例以返回给调用者。
示例:
export class UserService {
getUserFromBE(login: string): Observable<User> {
return this.http
.get<{id:string;name:string;my_list:Array<string>}>(`${environment.apiUrl}/user/${login}`)
.pipe(map(user => {
var result = new User();
result.id = user.id;
result.name = user.name;
result.my_list = user.my_list;
return result;
}),catchError(this.processHTTPMsgService.handleError));
}
}