Типу '{}' не хватает следующих свойств из типа 'FooModelDTO' - PullRequest
0 голосов
/ 14 июля 2020

Я использую Observable для возврата объекта из службы, эта служба проверяет, существует ли ее элемент в кеше, в противном случае он вызывает HTTP-запрос и возвращает http Observable, если элемент существует в кеше i ' m, используя rx js from.

foo.service.ts:

private foos: FooModelDTO[] = [];
getFoo(id: string) : Observable<FooModelDTO> {
    var foo = this.foos.find(x => x.id === id);
    if (foo) {
        return from(foo);    --> error!        
    }            

    return this._foosAPIService.getFooById(id);
}

foo-api.service.ts:

getFooById(id: string) : Observable<FooModelDTO> {
    return this._httpClient.get<FooModelDTO>(
        this._configService.resourceApiURI + 'foos/' + id
    );
}

foo.model.ts:

export class FooModelDTO {
  public id: string;

  constructor (
    id: string
  ) 
  {
    this.id = id;
    // other properties...
  }
}

ошибка TS2322: Тип «Observable <{}>» не может быть назначен типу «Observable». В типе '{}' отсутствуют следующие свойства из типа 'FooModelDTO': id, imagePath, updateDate, title и еще 6.

Как преодолеть эту ошибку? и немедленно вернуть результат кеширования, если он существует.

Ответы [ 2 ]

1 голос
/ 14 июля 2020

Я думаю, проблема в используемом вами Observable.
from используется для превращения массива, обещания или итерируемого объекта в наблюдаемое.

Вы должны использовать of вместо from.

import { of } from 'rxjs';

private foos: FooModelDTO[] = [];
getFoo(id: string) : Observable<FooModelDTO> {
    const foo = this.foos.find(x => x.id === id);
    if (foo) {
        return of(foo);       
    }            

    return this._foosAPIService.getFooById(id);
}
1 голос
/ 14 июля 2020

Обновление

Проблема в том, что вы получаете доступ к вашему массиву с помощью string вместо number. По этой причине тип foo - unknown вместо FooModelDTO.

Исходный ответ

Чтобы ответить на ваш вопрос, мы должны знать, что this.foods тип есть. Если набран правильный, все должно работать. Если вы не можете исправить его тип, вы можете позже преобразовать foo.

var foo: FooModelDTO = this.foos[id] as FooModelDTO;
if (foo) {
    return from(foo);
}    

Также from требует ввода типа ObservableInput<any>. Я бы рекомендовал использовать defer. Поскольку Observable , возвращаемое, если у вас есть промах в кеше, является ленивым, неплохо сделать Observable, вы получите попадание в кеш, также ленивым.

return defer(() => of(foo));
...