Angular 角度4/5 HttpClient:字符串类型的参数不可分配给';车身';

Angular 角度4/5 HttpClient:字符串类型的参数不可分配给';车身';,angular,typescript,angular-httpclient,Angular,Typescript,Angular Httpclient,医生说: 响应主体不会返回您可能需要的所有数据。有时 服务器返回特殊的标题或状态代码以指示特定的 条件,并检查这些可能是必要的。要做到这一点,你可以 告诉HttpClient您想要的是完整的响应,而不仅仅是正文 使用“观察”选项: 您必须内联这些选项。请参见8月9日alxhub的条目 2017年 Typescript需要能够静态推断observe和responseType值,以便为get()选择正确的返回类型。如果传入的选项对象类型不正确,则无法推断正确的返回类型 登录(凭证:凭证):可观察{

医生说:

响应主体不会返回您可能需要的所有数据。有时 服务器返回特殊的标题或状态代码以指示特定的 条件,并检查这些可能是必要的。要做到这一点,你可以 告诉HttpClient您想要的是完整的响应,而不仅仅是正文 使用“观察”选项:


您必须内联这些选项。请参见8月9日alxhub的条目 2017年

Typescript需要能够静态推断observe和responseType值,以便为get()选择正确的返回类型。如果传入的选项对象类型不正确,则无法推断正确的返回类型

登录(凭证:凭证):可观察{
返回此.httpClient.post(`${environment.USER\u SERVICE\u BASE\u URL}`,
{'username':credentials.username,'password':credentials.password}{
headers:newhttpheaders({'Content-Type':'application/json'}),
观察:“回应”
})
.map((res)=>。。。

我解决这个问题的方法是为请求选项创建一个接口,而不内联选项(这可能导致代码不干净)。代码如下所示:

导出接口iRequestStoptions{
身体?:任何;
标题?:HttpHeaders |{[标题:字符串]:字符串|数组};
观察?:任何;
params?:HttpParams{[param:string]:string | Array};
reportProgress?:布尔值;
responseType?:“arraybuffer”|“blob”|“json”|“text”;
withCredentials?:布尔值;
}
然后,这是这样使用的:

const选项:IRequestOptions={
标题:新的HttpHeaders({“内容类型”:“应用程序/json”}),
注意:“回应”
};
返回此.httpClient.post(`${environment.USER\u SERVICE\u BASE\u URL}`,
{“username”:credentials.username,“password”:credentials.password},选项)
.烟斗(
映射((res:HttpResponse)=>。。。
);

将原始post更改为使用
lettable
pipeable
(无论当前名称是什么)操作员Typescript抱怨此问题

类型“string”不可分配给类型“body”

要解决此问题,请手动将字符串转换为正文。示例:

const httpOptions={
标题:新的HttpHeaders({
“内容类型”:“应用程序/json”
}),
将“响应”视为“身体”
};
返回this.http.post(url、数据、httpOptions);

…我得到了一个编译时间错误…
@Igor我添加了我的代码版本。我在get请求(没有正文部分)和没有“headers”-属性时得到了相同的错误。因此,本质上它与angular网站上的代码相同,您必须内联这些选项。还可以与“response”一起使用。const options={headers:headers,observe:response as'response'};嗨,Michael,欢迎使用SO!请尽量避免只使用代码的答案,并稍微描述一下您的解决方案。
http
  .get<MyJsonData>('/data.json', {observe: 'response'})
  .subscribe(resp => {
    // Here, resp is of type HttpResponse<MyJsonData>.
    // You can inspect its headers:
    console.log(resp.headers.get('X-Custom-Header'));
    // And access the body directly, which is typed as MyJsonData as requested.
    console.log(resp.body.someField);
  });
  login(credentials: Credentials): Observable<any> {
    const options = {
      headers: new HttpHeaders({'Content-Type': 'application/json'}),
      observe: 'response'
    };
    return this.httpClient.post<any>(`${environment.USER_SERVICE_BASE_URL}`,
      {'username': credentials.username, 'password': credentials.password}, options)
      .map((res) => ...
login(credentials: Credentials): Observable<any> {
    return this.httpClient.post<any>(`${environment.USER_SERVICE_BASE_URL}`,
      {'username': credentials.username, 'password': credentials.password}, {
      headers: new HttpHeaders({'Content-Type': 'application/json'}),
      observe: 'response'
    })
      .map((res) => ...
import { HttpHeaders, HttpParams } from '@angular/common/http';
export interface IRequestOptions {
    headers?: HttpHeaders | { [header: string]: string | string[]; };
    observe: "response"; 
    params?: HttpParams | { [param: string]: string | string[]; };
    reportProgress?: boolean; 
    responseType?: "json";
    withCredentials?: boolean; 
}