Угловая подписка теряет фактический тип класса - PullRequest
0 голосов
/ 17 мая 2019

Когда мой метод обслуживания subscribe запускается, я возвращаю объект вместо фактического класса, и я не могу понять, почему. Я создал метод в своем сервисе, который возвращает реальный класс, основанный на JSON, а не только интерфейс json:

getById(id: number): Observable<DetailsForLabAndCaller> {
    return this.http.get<DetailsForLabAndCaller>(`${this.baseUrl}/${id}/new`).pipe(
        tap(x => DetailsForLabAndCaller.fromJson(x))
    );
}

И мой fromJson метод выглядит так:

static fromJson(json: any): DetailsForLabAndCaller {
    const ret: DetailsForLabAndCaller = Object.assign(new DetailsForLabAndCaller(), json);

    ret.me = WorkerInfo.fromJson(ret.me);
    ret.lab = Lab.fromJson(ret.lab);

    console.info(`fromJson: has lab type: ${ret.lab instanceof Lab}`);
    console.info(`fromJson: has WorkerInfo type: ${ret.lab.delegate instanceof WorkerInfo}`);
    console.info(`fromJson: returns a DetailsForLabAndCaller: ${ret instanceof DetailsForLabAndCaller}`);

    return ret;
}

Когда вызывается служба, я вижу, что каждое из этих сообщений консоли возвращает true. Однако, когда я тогда пытаюсь использовать этот сервис, я просто получаю object назад, а не реальный объект класса:

this.spaceService.getById(id).subscribe(obj => {
    console.info(`Call returned a real class: ${obj instanceof DetailsForLabAndCaller}`);

Это консольное сообщение, которое печатается после первых трех, гласит false. Почему я просто возвращаю ванильный объект в этот момент вместо реального класса?

1 Ответ

2 голосов
/ 17 мая 2019

Вы использовали tap в getById, который просто пропускает входящее значение и обычно используется для побочных эффектов. Таким образом, возвращаемое значение из DetailsForLabAndCaller.fromJson(x) никогда не используется. Чтобы фактически отобразить возвращаемое значение, вы должны использовать map.

getById(id: number): Observable<DetailsForLabAndCaller> {
    return this.http.get<DetailsForLabAndCaller>(`${this.baseUrl}/${id}/new`).pipe(
        map(x => DetailsForLabAndCaller.fromJson(x))
    );
}
...