类型“ {}”缺少类型“ FooModelDTO”的以下属性

时间:2020-07-14 10:26:23

标签: angular rxjs observable

我正在使用Observable从服务返回一个对象,该服务检查其项是否在缓存中,否则它将调用http请求并返回http的Observable(如果该项存在)在缓存中,我正在使用rxjs 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 <{}>'无法分配给该类型 “可观察”。 类型“ {}”缺少类型“ FooModelDTO”中的以下属性:id,imagePath,updateDate,title和另外6个。

如何克服此错误?并在存在缓存结果的情况下立即返回。

2 个答案:

答案 0 :(得分:1)

更新

问题是您用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));

答案 1 :(得分:1)

我认为问题出在您正在使用的Observable中。
from 用于将数组,promise或可迭代对象转换为可观察对象。

您应该使用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);
}