【问题标题】:How to use model to set data type of an Observable in Angular如何使用模型在 Angular 中设置 Observable 的数据类型
【发布时间】:2021-05-25 18:53:28
【问题描述】:

我有一个与服务相关的非常基本的问题。我的服务中有这个方法getAllArticlesFromDb,它将使用HTTP 的GET 调用从API 中获取数据。方法如下:

article.service.ts

getAllArticlesFromDb() : Observable<any> {
  return this._httpClient.get('https://obscure-tundra-38074.herokuapp.com/api/articles');
}

我认为我不应该使用&lt;any&gt;,因为我知道 API 返回的对象的结构。所以我创建了一个模型:

article-model.ts

export class Article {
    articleid: string | undefined;
    title: string | undefined;
    content: string | undefined;
    date: string | undefined;
    contributor: string | undefined;
}

问题从这里开始。为什么我不能像这样修改我的服务方法:

import { Article } from './model/article-model';

getAllArticlesFromDb() : Observable<Article> {
  // same GET call
}

我收到此错误:

“类型'可观察对象'不可分配给类型'可观察文章'。 “对象”类型可分配给极少数其他类型。您的意思是改用“任何”类型吗? 类型 'Object' 缺少类型 'Article' 的以下属性:articleid、标题、内容、日期和另外 1 个。”

请纠正我的错误。

【问题讨论】:

标签: angular


【解决方案1】:

您需要在HttpClient get 调用上使用泛型重载。然后返回将匹配您的方法签名中指定的内容。

import { Article } from './model/article-model';

getAllArticlesFromDb() : Observable<Article> {
  return this._httpClient.get<Article>('https://obscure-tundra-38074.herokuapp.com/api/articles');
}

在读取结束点 url 和方法名称后,您可能打算返回该类型的数组,在这种情况下将其更改为 Array&lt;Article&gt;&gt;

import { Article } from './model/article-model';

getAllArticlesFromDb() : Observable<Array<Article>> {
  return this._httpClient.get<Array<Article>>('https://obscure-tundra-38074.herokuapp.com/api/articles');
}

【讨论】:

  • 我认为这回答了我的问题。将在 7 分钟内接受这个
  • 您是否也检查了我的 API 的响应?
  • @Tanzeel 在我看来就像一个对象数组,所以我的答案中使用 Array&lt;Article&gt; 的第二个代码块是可行的方法。
  • 是的,这是一个对象数组。数据实际上是从 mongodb 集合中获取的。
【解决方案2】:

因为this.http.get 返回一个Observable&lt;any&gt;。您可以使用this.http.get&lt;Article&gt; 指定返回的对象类型或使用this.http.get(&lt;parameters&gt;) as Observable&lt;Article&gt; 进行强制转换

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-30
    • 2014-05-29
    • 2014-08-23
    • 1970-01-01
    • 2020-11-07
    • 2020-05-23
    相关资源
    最近更新 更多