我正在使用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个。
如何克服此错误?并在存在缓存结果的情况下立即返回。
答案 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);
}