可以't我在Angular中使用getter和setter's的httpclient结果



在我的angular项目中,我有一个从后端返回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"声明为结果类型,那么u不应该是User类型吗?我能强迫它吗?

显然,api只返回my_list字段。

有人能解释一下为什么u是Object而不是User吗?

感谢

HttpClient上的泛型方法将对反序列化的json结果使用类型断言。示例:.get<User>仍然会返回一个对象,但类型断言现在可以在静态代码中使用,将返回的实例视为User。这并不意味着返回的实例的类型为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));
}
}

最新更新