【问题标题】:Angular 6 how to set the return type of a promise from observerAngular 6如何设置来自观察者的承诺的返回类型
【发布时间】:2019-04-12 16:13:01
【问题描述】:

我通常是 observable 的一员,但为了防止在这种情况下出现“回调地狱”,我在上面使用 toPromise() 以方便起见,但在尝试定义返回类型时我收到了 lint 错误消息:

“对象”类型可以分配给极少数其他类型。您的意思是改用“任何”类型吗?类型“对象”缺少 'ReferralReasons[]' 类型的以下属性:长度

我的代码(this.apiSvc.get 返回 http.get 对象):

async getJobReferralReasons(): Promise<Array<ReferralReasons>> {
    return this.apiSvc.get(`${this.API_JOB}/ReferralReasons`).toPromise();
}

但这很好,没有错误:

async getJobReferralReasons(): Promise<any> {
    return this.apiSvc.get(`${this.API_JOB}/ReferralReasons`).toPromise();
}

所以当调用它时,我会在一个数组中直接得到一组推荐代码:

const reasons = await this.helpdeskSvc.getJobReferralReasons();

我原以为更改 any 并设置类型 Array&lt;ReferralReasons&gt; 会起作用,我缺少什么来设置正确的类型?

---更新

我的服务调用如下所示:

get(apiURL, data = {}) {
    return this.http.get(this.parseURL(apiURL), {
        headers: this.getHeaders(),
        params: this.parseGetParams(data)
    });
}

但这可行,但它不是我所拥有的(你可以看到它略有不同,我不能将类型放在 get 之前):

async getJobReferralReasons2(): Promise<ReferralReasons[]> {
    return this.http.get<ReferralReasons[]>('', {}).toPromise();
}

【问题讨论】:

  • 你能真实地描述 StackBlitz 中的错误吗? ashish.gd 所说的应该有效

标签: angular typescript http promise


【解决方案1】:

您需要使用预期的返回类型更新您的 http get 调用,以便 promise 识别它。

例子:

apiSvc 使用 T 模板作为类型。

get<T>(apiURL, data = {}) {
  return this.http.get<T>(this.parseURL(apiURL), {
      headers: this.getHeaders(),
      params: this.parseGetParams(data)
  });
}

组件使用实际类型

async getJobReferralReasons(): Promise<Array<ReferralReasons>> {
    return this.apiSvc.get<Array<ReferralReasons>>(`${this.API_JOB}/ReferralReasons`).toPromise();
}

async getJobReferralReasons(): Promise<ReferralReasons[]> {
    return this.apiSvc.get<ReferralReasons[]>(`${this.API_JOB}/ReferralReasons`).toPromise();
}

【讨论】:

  • IDE 似乎不喜欢这两种语法,并抱怨说“预期类型参数为 0,但得到了 1。”
  • 您是否在您的apiSvc 中包装了httpClient's get 方法?
  • 更新了答案。 get 方法应该接受模板类型。现在,您可以在从组件调用 get 方法时提供实际类型。
  • 完美的 成功了——我今天学到了一些新东西,谢谢!
猜你喜欢
  • 2019-07-23
  • 1970-01-01
  • 2018-12-30
  • 1970-01-01
  • 2019-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多