Разве я не могу использовать геттеры и сеттеры в результате httpclient Angular? - PullRequest
2 голосов
/ 27 апреля 2020

В моем 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) возвращает тип объекта, а не тип пользователя, как должно быть.

Теперь, если я объявил «: Observable» как тип результата из вызова httpclient в getUserFromBE, разве вы не должны иметь тип User? Можно ли заставить его быть таким?

Очевидно, что API возвращает просто поле my_list.

Может кто-нибудь объяснить, почему вы Object, а не User?

Спасибо

1 Ответ

2 голосов
/ 27 апреля 2020

Методы generi c в HttpClient будут использовать утверждение типа для десериализованного результата json. Пример: .get<User> будет по-прежнему возвращать объект, но теперь утверждение типа может использоваться в коде stati c для обработки этого возвращенного экземпляра как 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));
  }
}
...