【问题标题】:IHttpPromise<{}>, Observable<SomeType[]> how to make it work in http call?IHttpPromise<{}>, Observable<SomeType[]> 如何让它在 http 调用中工作?
【发布时间】:2019-01-03 15:26:09
【问题描述】:

我正在为 AngularJS、TypeScript 和 RxJs 苦苦挣扎。

我在 Typescript 中使用 rxJs 在组件拱门中编写代码。 但它仍然是 AngularJs ;)

我已经将接口 Car 定义为 id、brand 和 model 字段作为匹配 API 的字符串。

现在我正在对 rest API 进行 HTTP 调用,当我尝试使用该接口定义类型时,它给了我一个错误。 我不知道我做错了什么。 Angular 6 方式可能太多了。

我有一个变量

public cars$: Observable<Car[]>;

现在在构造函数中,我正在尝试从 API 获取汽车...

this.cars$ = fromPromise(this.$http.get('http://...someurl...')).pipe(map((data: IHttpResponse<{}>) => data));

我应该如何更改 data: IHttpResponse&lt;{}&gt; 行以使其适用于 Car 类型?

我尝试了几十种变体,但出现错误

“类型 Observable 不可分配给类型 Observable” “参数不可分配给参数” “源和源的类型不兼容”...

我做错了什么?

【问题讨论】:

  • 您在angularjsangular 吗?哪个版本?
  • 正如我在顶部所说的。 Angular js 1.6.9
  • 我把标签改成了angularjs,但是这段代码看起来很像Angular v2+?
  • 因为我正在尝试学习如何将我在 angularJS 中的旧项目升级到 Angular2+,所以我使用 rxJs 在组件拱门中使用 Typescript 进行编码。但它仍然是 AngularJs ;)

标签: angularjs typescript rxjs


【解决方案1】:

查看IHttpResponse的类型定义

interface IHttpResponse<T> {
    data: T;
    status: number;
    headers: IHttpHeadersGetter;
    config: IRequestConfig;
    statusText: string;
    /** Added in AngularJS 1.6.6 */
    xhrStatus: 'complete' | 'error' | 'timeout' | 'abort';
}

我们看到它将有一个类型为 T 的成员 data。我们可以通过将类型放在菱形中来告诉 typescript T 是什么

IHttpResponse<Car[]>

用我们的接口现在看起来像这样的类型替换泛型

interface IHttpResponse {
    data: Car[];
    status: number;
    headers: IHttpHeadersGetter;
    config: IRequestConfig;
    statusText: string;
    /** Added in AngularJS 1.6.6 */
    xhrStatus: 'complete' | 'error' | 'timeout' | 'abort';
}

所以我们希望我们的函数看起来像这样:

(response: IHttpResponse<Car[]>) =>{ 
    //looking at the above interface we see that response.data is now Car[];
    const carArray:Car[] = response.data 
    return carArray;
}

Map 返回一个我们返回的 Observable,所以它会匹配你的变量声明 cars$: Observable&lt;Car[]&gt;;

我怀疑在调用fromPromise() 并传入get 时类型信息丢失了。尝试提供 fromPromise 类型信息

fromPromise(this.$http.get<Car[]>('http://...someurl...'))

【讨论】:

  • 好的,但是......当我这样做时,它给了我一个错误“'UnaryFunction>, Observable>'类型的参数不是可分配给“UnaryFunction>, Observable>”类型的参数。参数“source”和“source”的类型不兼容。类型“Observable>”不可分配给类型“Observable>”。类型“IHttpResponse”不可分配给类型“IHttpResponse”。类型“{}”不可分配给类型“ Car[]'。“{}”类型中缺少属性“length”。”
  • 这就是为什么我想将一些项目升级到 Angular2+。它在那里工作更容易......有趣的是我尝试了你的解决方案,但我很困惑为什么它仍然是错误的。在 http.get 之后我永远不会选择那种类型。
  • 是的,调试起来很棘手。如果您查看此typescript playground 并将鼠标悬停在`ipsum` 上,您将看到const ipsum: Lorem&lt;{}&gt;,这意味着当未指定泛型类型时,它默认为{}。感谢您的问题帮助我了解了更多关于泛型的信息
猜你喜欢
  • 2017-10-28
  • 1970-01-01
  • 2016-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多