Угловой класс отклика 4+ HttpClient - PullRequest
0 голосов
/ 27 апреля 2018

У меня проблема с попыткой присвоить ответ 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, возвращаемый объект не относится к типу APIResponse, а представляет собой простой объект:

{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, поскольку он фактически не меняет тип объекта ответа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...