Angular Карта объекта из Get to Interface - PullRequest
0 голосов
/ 14 апреля 2020

Я получаю JSON объект из API. В сервисе у меня есть:

getUserInfo(token: string): Observable<IUser> {
    return this.http.get<any>(this.apiUrl.getUser, {headers: {'X-Auth-Token': token}}).pipe(
      tap(data => console.log(data)),
      catchError(this.handleError)
    ); 
  }

В компоненте:

this.authenticationService.getUserInfo(this.token).subscribe({
                  next: result => {
                    this.user = result;
                    console.log(this.user);
                  },
                  error: err => console.log(err)
                })

Это мой интерфейс (упрощенно):

export class IUser {
    username: string;
    email: string;
    role: string;
    numberOfUsers: number;
    expirationDate: string;
}

Есть ли способ автоматического сопоставления JSON от http-запроса к этому интерфейсу, поэтому:

  1. Если свойство не существует в JSON объекте из запроса, установите для него значение по умолчанию, например, numberOfUsers = 0 или expirationDate = null.
  2. Если в объекте JSON есть дополнительное свойство из запроса, просто проигнорируйте его.

В настоящее время пользователь перезаписывается значениями из JSON объекта из запроса.

Есть ли какая-нибудь автоматическая c функция Objectable, которая бы это делала? Или я должен написать этот метод в интерфейсе?

1 Ответ

0 голосов
/ 14 апреля 2020

то, что вы описываете, это класс, вы не можете иметь значения по умолчанию в интерфейсе. проверьте преобразователь класса, он делает то, что вам нужно: https://github.com/typestack/class-transformer

Он может преобразовать простой объект в экземпляр класса и учитывать значения по умолчанию и несвязанные поля:

export class IUser {
    username: string;
    email: string;
    role: string;
    numberOfUsers: number = 0;
    expirationDate: string = null;
}

this.user = plainToClass(IUser, result, {
    excludeExtraneousValues: true, // <- ignores keys not for the class.
});
...