Angular 6 HttpClient возвращает экземпляр класса - PullRequest
0 голосов
/ 21 мая 2018

До появления нового HttpClient от angular наши объекты, возвращаемые из вызова http api, могли проверяться с помощью ключевого слова instanceof.они больше не могут с модулем HttpClient.Я пытаюсь несколько простых методов, но проверки типов возвращают false каждый раз.желаемое поведение:

`` `

getCow() {
    return this.http.get<Cow>(ApiRoute.GET_COW, options)
        .map(res => res as Cow)
        .toPromise()
        .then((c: Cow) => {
            console.log(c instanceof Cow); //this is false
        })
}

` ``

вернет true.Кто-нибудь знает простой способ создания экземпляра за кулисами http-клиента?

1 Ответ

0 голосов
/ 22 мая 2018

TypeScript использует структурную типизацию , т. Е. c объект не обязательно должен быть экземпляром Cow класса , чтобы соответствовать Cow типу .

Типы TypeScript существуют только во время компиляции и никак не влияют на вывод JS (за исключением испускаемых типов, которые используются для Angular DI).as Cow утверждает, что res соответствует типу Cow, а instanceof Cow ожидает, что c является экземпляром класса Cow.Поскольку Cow не был создан, cow instanceof Cow имеет значение false.

Класс должен быть разработан для поддержки гидратации (возможно, через параметры конструктора) и создан в явном виде:

class Cow {
  sound: string;
}

return this.http.get<Cow>(ApiRoute.GET_COW, options)
    .map(res => Object.assign(new Cow(), res as Cow))
    .toPromise()
    .then((c: Cow) => {
        console.log(c instanceof Cow);
    })

Еслинекоторая логика необходима для создания Cow экземпляра из простого объекта (проверка, построение вложенного объекта), это можно сделать в конструкторе классов или в отдельной вспомогательной функции (например, Cow статический метод).

...