Я видел два метода для преобразования ответа в нашу пользовательскую модель данных.
Интерфейс
export interface User {
id: number;
name: string;
more_complex_object: // so I am not sure how do this in right way. pass here another interface
//or just a object like {id: '', name: ''}. I show how to do this in class way...
}
И в обслуживании:
return this.http.get<User>...
И это прекрасно, нет необходимости делать что-то большее.
Класс
export interface Deserializable {
deserialize(input: any): this;
}
export class ComplexModel implements Deserializable {
field1: string;
field2: number;
field3: number;
deserialize(input: any): this {
Object.assign(this, input);
return this;
}
}
export class User implements Deserializable {
id: number;
name: string;
complex: ComplexModel;
deserialize(input: any): this {
Object.assign(this, input);
this.complex = new ComplexModel().deserialize(input.complex));
return this;
}
}
И в обслуживании
return this.http.get('/users/id/').pipe(
map(user => new User().deserialize(user))
);
Как мы можемсм. в методе класса мы должны вручную создать объект.Это хорошо с объектом, как указано выше, но когда у нас есть более сложный объект или массив объектов, мы должны сделать что-то вроде этого:
return this.http.get('/users').pipe(
map(users => {
if (users instanceof Array) { // <- to avoid 'object has no method map' error
return users.map(user => {
return new User().deserialize(user);
});
}
})
);
Классическим способом мы имеем гораздо более сложный код.И, наконец, вопросы:
Есть идеи, как сделать это как можно лучше?Какие методы лучше для вас и почему?
Интерфейс выглядит более красиво, но у нас нет «реального объекта», поэтому мы не можем использовать методы класса и т. Д., Верно?
В классе мы получаем реальный объект, но так ли он нужен?