我不能在Angular的httpclient结果中使用getter和setter吗?

问题描述 投票:2回答:1

在我的有角项目中,我有一个方法从后端返回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吗?

谢谢

javascript angular typescript observable
1个回答
2
投票

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));
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.