Угловой 4+ HttpClient Класс ответа
У меня проблема, когда я пытаюсь назначить ответ JSON во вложенный типизированный класс.
Типы, которые я использую, следующие
Абстрактный ресурсный класс:
export abstract class JBResource {
abstract type: string;
abstract header: string;
abstract info: string;
}
Класс ресурса клиента:
import {JBResource} from './jbresource';
export class JBCustomer extends JBResource {
// Inherited variable
type = 'Customer';
get header(): string {
return this.name;
}
get info(): string {
return this.address1 + ', ' + this.postcode;
}
// Own variables
get id(): number {
return this.customerid;
}
customerid: number;
name: string;
address1: string;
address2: string;
address3: string;
address4: string;
postcode: string;
phone: string;
fax: string;
mobile: string;
email: string;
fromemail: string;
domain: string;
website: string;
}
Класс ответа API:
import {JBResource} from './jbresource';
export class JBAPIResult<T extends JBResource> {
status: number;
error: string;
results: T[];
}
Я хочу вызвать API, который отвечает структурированным JSON, с типизированным запросом get от Angular HttpClient, но результат получается как нетипизированный объект, а не как я ожидаю:
searchResults: JBCustomer[] = [];
constructor(private http: HttpClient) {
}
getCustomers() {
this.http.post<JBAPIResult<JBCustomer>>('/assets/customersService.php', {
action: 'search',
})
.subscribe(res => {
console.log('HTTP response', res);
this.searchResults = res.results;
console.log('Search Results', this.searchResults);
}, err => {
const sbRef = this.snackBar.open('Error getting customers', 'OK');
console.log('Alert Rule Fetch Error:', err);
}
);
}
Как видно из ответов Chrome, возвращаемый объект не относится к типу API Response, а представляет собой простой объект:
{status: 1, search: "%arta%", results: Array(1)}
results: Array(1)
0:
address1: "REDACTED, "
address2: "REDACTED, "
address3: "REDACTED, "
address4: "REDACTED"
customerid: "REDACTED"
email: "REDACTED"
fax: "REDACTED"
mobile: "REDACTED"
name: "REDACTED"
phone: "REDACTED"
postcode: "REDACTED"
__proto__ :Object
length: 1
__proto__: Array(0)
search: "%arta%"
status: 1
__proto__: Object
Из предыдущих ответов я понимаю, что применение к HttpClient просто предоставляет интерфейсы типа T, чтобы вы могли получить к ним доступ.
Как на самом деле HttpClient анализирует результат в классе, который я хочу, чтобы я мог использовать методы доступа.
Без фактического приведения типов, какой смысл использовать HttpClient, а не просто HttpClient, поскольку он фактически не меняет тип объекта ответа.