无法将响应类型对象设置为响应类型变量

时间:2017-09-01 13:32:12

标签: angular typescript observable

我收到以下错误。

  

类型'响应'的争论不能分配给'响应'类型的参数   财产'身体'类型'响应'

中缺少

我运行的代码依赖于observables。

public register(reporter: Reporter): Observable<Response> {

  const content = JSON.stringify(reporter);
  const headers = new Headers({ "Content-Type": "application/json" });
  const options = new RequestOptions({ headers: headers });
  const userUrl = env.Url + "user";
  const passwordUrl = env.Url + "PasswordClaim/" + reporter.Id;

  const observable = new Observable<Response>(_ => {
    this.http
      .post(userUrl, content, options)
      .subscribe(result => this.http
          .get(passwordUrl)
          .subscribe(result => _.next(result), error => _.error(error)),
      error => _.error(error));
  });

  return observable;
}

在此之前,我们使用了弱类型的observable,它可以正常工作,但并不像我希望的那样正确和整洁。所以,我在结果上徘徊,并得到 Response 类型的内容。但是,使用它似乎会产生这种奇怪的错误信息。

我可以想象它的不同类以相同的方式命名并放在不同的命名空间中。然而,谷歌搜索没有给我任何确认,更不用说建议如何解决它的解决方案。有suggestions可以省略所有输入,但这不是问题的一部分。

1 个答案:

答案 0 :(得分:1)

你在这里做的是返回Observable的Observable。您的方法应该按照

的方式输入
public register(reporter: Reporter): Observable<Reporter> {}

public register(reporter: Reporter): Observable<any> {}

也许你可以试试看结果?

编辑我现在能更好地掌握您的问题。

尝试这样的事情

public register(reporter: Reporter): Observable<Response> {

  const content = JSON.stringify(reporter);
  const headers = new Headers({ "Content-Type": "application/json" });
  const options = new RequestOptions({ headers: headers });
  const userUrl = env.Url + "user";
  const passwordUrl = env.Url + "PasswordClaim/" + reporter.Id;

  return this.http
    .post(userUrl, content, options)
    .flatMap(result => this.http.get(passwordUrl));
}

基本上,HTTP调用将返回响应。通过使用订阅,您实际上管理响应。你正在做的是处理响应,返回一个新的自定义响应。

我做的是用flatMap进行两次调用,并返回最后一次调用的结果。

编辑2 以下是完整的功能:

public register(reporter: Reporter): Observable<Response> {

  let ret = {};

  const content = JSON.stringify(reporter);
  const headers = new Headers({ "Content-Type": "application/json" });
  const options = new RequestOptions({ headers: headers });
  const userUrl = env.Url + "user";
  const passwordUrl = env.Url + "PasswordClaim/" + reporter.Id;

  return this.http
    .post(userUrl, content, options)
    .flatMap(result => {
      ret['result1'] = result;
      return this.http.get(passwordUrl).map(r => ret['result2'] = r);
    });
}