【问题标题】:Type '{}' is missing the following properties from type 'FooModelDTO'类型“{}”缺少类型“FooModelDTO”的以下属性
【发布时间】:2020-07-14 10:26:23
【问题描述】:

我使用Observable从服务返回一个对象,该服务检查它的项目是否存在于缓存中,否则它调用一个http请求并返回http的Observable,以防该项目存在于缓存中i' m 使用 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 个。

如何克服这个错误?并在缓存结果存在时立即返回。

【问题讨论】:

  • 您需要使用of 运算符,而不是使用from
  • 您确定要根据索引从foos 数组中获取foo,而不是在'FooModelDTO' 内的id 属性上吗?
  • 嘿@DurgeshPal 谢谢,我已经更新了问题以使用find

标签: angular rxjs observable


【解决方案1】:

更新

问题是您使用string 而不是number 访问您的数组。因此foo 的类型是unknown 而不是FooModelDTO

原答案

要回答您的问题,我们必须知道this.foods 类型是什么。如果输入正确,它应该可以工作。如果你不能修复它的类型,你可以稍后转换foo

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

同样from 需要ObservableInput&lt;any&gt; 类型的输入。我建议使用defer。由于如果您有缓存未命中返回的Observable 是惰性的,因此最好将Observable 设置为缓存命中,同时也是惰性的。

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

【讨论】:

  • 嘿@kai,查看更新后的问题,this.foos 属于同一类型
  • 我再次更新了问题以使用 find 而不是索引访问
  • @ShaharShokrani 此更改是否解决了问题?我希望该更改可以解决您的打字问题?
  • 其实of 解决了这个问题
  • @ShaharShokrani 这是一个不同的问题。我将您的代码复制粘贴到 stackblitz 中,解决第一个问题后,第二个问题是 of。您发布的错误信息与of 问题不符。
【解决方案2】:

我认为问题出在您正在使用的 Observable 中。
from 用于将数组、promise 或 iterable 转换为 observable。

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

【讨论】:

    猜你喜欢
    • 2021-04-20
    • 2021-07-29
    • 1970-01-01
    • 1970-01-01
    • 2019-09-11
    • 2020-10-28
    • 1970-01-01
    • 1970-01-01
    • 2019-06-21
    相关资源
    最近更新 更多