Typescript和Angular的奇怪编译错误

js5cn81o  于 2023-10-22  发布在  TypeScript
关注(0)|答案(1)|浏览(105)

在一个Angular应用程序中,我有一个服务,它有一个从REST服务器获取简单字符串方法。此代码无法编译:

getText(): Promise<String> {
    const httpOptions = {
      headers: new HttpHeaders({'Content-Type': 'application/json',  accept: 'text/plain'}),
      responseType: 'text'
    }    
    return firstValueFrom(this.httpClient.get(this.endPoint + this.publicUrl, httpOptions))
  }

这也不是:

getText(): Promise<String> {
    const httpOptions: Object = {
      headers: new HttpHeaders({'Content-Type': 'application/json',  accept: 'text/plain'}),
      responseType: 'text'
    }    
    return firstValueFrom(this.httpClient.get(this.endPoint + this.publicUrl, httpOptions))
  }

但这编译和工作:

getText(): Promise<String> {
    return firstValueFrom(this.httpClient.get(this.endPoint + this.publicUrl, {
      headers: new HttpHeaders({'Content-Type': 'application/json',  accept: 'text/plain'}),
      responseType: 'text'
    }))
  }

为什么我不能在HttpClient.get()中使用变量作为第二个参数?
谢谢

gr8qqesn

gr8qqesn1#

httpClient.get有一个带有15个重载的签名。
它们中的一些依赖于responseType的类型。
当你写

const httpOptions = {
  headers: new HttpHeaders({'Content-Type': 'application/json',  accept: 'text/plain'}),
  responseType: 'text'
}

httpOptions被推断为{headers: HttpHeaders; responseType: string;}
正如你所看到的,responseType被加宽到string,这就是为什么TS无法找到你正在寻找的正确重载。
使用as const可以解决这里的问题,responseType将不再被加宽并定义为responseType: 'test'

const httpOptions = {
  headers: new HttpHeaders({'Content-Type': 'application/json',  accept: 'text/plain'}),
  responseType: 'text'
} as const

相关问题