首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >可观察的HttpEvent不能指定在类型记录中键入可观察的类型

可观察的HttpEvent不能指定在类型记录中键入可观察的类型
EN

Stack Overflow用户
提问于 2022-04-21 22:47:56
回答 2查看 563关注 0票数 0

我从我的应用程序调用REST,我用类型记录编写了服务类下面的代码。我想调用不同的url,并根据环境选择传递不同的。例如:如果环境是dev,那么userURL值应该是http://mydomain-dev.com/users/标头应该是devHttpOptions,对于E 117QAE 218-d19应该是http://mydomain-qa.com/users/和E 121头E 222应该是qaHttpOptions等等。

我编写了下面的开关案例语句,基于环境值,我正在决定应该分配哪个urlheader

但是,当我在this.httpOptions中传递get method - this.http.get<User[]>(this.userURL, this.httpOptions)时,编译时出错。

代码语言:javascript
运行
复制
Type 'Observable<HttpEvent<User[]>>' is not assignable to type 'Observable<User[]>'.
  Type 'HttpEvent<User[]>' is not assignable to type 'User[]'.
    Type 'HttpSentEvent' is missing the following properties from type 'User[]': length, pop, push, concat, and 28 more.ts(

请在下面找到我的代码:

UserService.ts

代码语言:javascript
运行
复制
import { Injectable } from "@angular/core";
import { HttpClient } from "@angular/common/http";
import { Observable } from "rxjs";
import { User } from "./user";
import { HttpHeaders } from '@angular/common/http';


@Injectable({ providedIn: 'root' })
export class UserService {

    constructor(private http: HttpClient) { }

    userURL: any;
    httpOptions: any;
    devHttpOptions = {
        headers: new HttpHeaders({
            'Content-Type': 'application/json',
            'Authorization': 'Basic ' + btoa('dev-xxxx:yyyy')
        })
    };

    qaHttpOptions = {
        headers: new HttpHeaders({
            'Content-Type': 'application/json',
            'Authorization': 'Basic ' + btoa('qa-xxxx:yyyy')
        })
    };

    prodHttpOptions = {
        headers: new HttpHeaders({
            'Content-Type': 'application/json',
            'Authorization': 'Basic ' + btoa('prod-xxxx:yyyy')
        })
    };


    getUsers(environment): Observable<User[]> {

        console.log(environment);
        switch (environment) {
            case 'dev':
                this.userURL = 'http://mydomain-dev.com/users/';
                this.httpOptions = this.devHttpOptions;
                break;
            case 'qa':
                this.userURL = 'http://mydomain-qa.com/users/';
                this.httpOptions = this.qaHttpOptions;
                break;
            case 'prod':
                this.userURL = 'http://mydomain-prod.com/users/';
                this.httpOptions = this.prodHttpOptions;
                break;

        }
        return this.http.get<User[]>(this.userURL, this.httpOptions);
    }

}

你能帮我解决这个问题吗。感谢您的提前帮助!谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-04-21 23:41:23

在类型为any的httpsOptions变量上找不到headers,因此您可以直接以这种方式使用它。你应该这样做:

代码语言:javascript
运行
复制
return this.http.get<User[]>(this.userURL, {
        headers: this.httpOptions?.headers
    });
票数 1
EN

Stack Overflow用户

发布于 2022-04-21 23:50:26

您可以在这里看到get()的所有重载:

https://angular.io/api/common/http/HttpClient#get

它不知道httpOptions是一个对象,所以它使用了错误的重载。当您使用any时,它默认为与get<T>匹配的第一个重载,该重载返回Observable<HttpEvent<T>>。如果声明一个没有observe属性的对象,它将使用所需的重载,因为observe是该对象的可选属性,而其他属性是必需的。

httpOptions初始化为对象或将其声明为对象。

代码语言:javascript
运行
复制
httpOptions = {};

代码语言:javascript
运行
复制
httpOptions: Object;

或者,您可以将observe: 'body'放在options对象上。它将显式地选择所需的重载。

代码语言:javascript
运行
复制
  httpOptions: any;

  getUsers(environment) {
    ...
    return this.http.get<User[]>(this.userURL, {
      ...this.httpOptions,
      observe: 'body',
    });
  }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71961655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档