【问题标题】:Angular Error_for_TS2554 Expected 0 arguments, but got 3Angular Error_for_TS2554 预期 0 个参数,但得到 3 个
【发布时间】:2019-11-23 00:59:18
【问题描述】:

为所有调用创建了一个通用的 httpServie。

  export class HttpApiService {
    constructor( private httpClient: HttpClient) {}
    public getData<T>(url: string, headers?: HttpHeaders): Observable<T> | Observable<any> {
        this.customReqOptions = this.getHeaders(headers);
        return this.httpClient.get(`${this.endPoint}${url}`, { headers: this.customReqOptions});
    }
  }

从用户服务调用它

export class UserService {
    constructor(private httpApi: HttpApiService) {
    }

    public getUsers(): Observable<any>{
      return this.httpApi.getData('users')
      .pipe(
        tap((res) => {console.log('res,',res)}),
        publishReplay(1),
        refCount()
      );
    }
}

管道 () 一个给出错误 TS2554: Expected 0 arguments, but got 3.

为参考创建了一个代码:https://stackblitz.com/edit/anglearn

即使在 VS 代码中运行时也会遇到同样的问题

我错过了什么? 虽然使用最新版本@angular: v8, rxjs: 6.4 using ngcli.

【问题讨论】:

    标签: angular rxjs6 angular8


    【解决方案1】:

    像这样更改您的 getData 方法:

    public getData<T>(url: string, headers?: HttpHeaders): Observable<T> {
            this.customReqOptions = this.getHeaders(headers);
            return this.httpClient.get<T>(`${this.endPoint}${url}`, { headers: this.customReqOptions});
        }
    

    由于某些原因,TS 编译器不喜欢泛型方法返回Observable&lt;any&gt;。注意 - 没有运行时错误。

    查看工作中的 stackblitz - https://stackblitz.com/edit/anglearn-tezbyk?file=src/app/common/httpApi.service.ts

    【讨论】:

    • 谢谢。 'Observable' 中的本地 VS ERROR 中的连线编译时间错误不可分配给类型 'Observable'。类型“对象”不可分配给类型“T”。 “对象”类型可分配给极少数其他类型。您的意思是改用“任何”类型吗?得到了不同的解决方案.. 下面粘贴
    • 从技术上讲,“任何”都可以,因为它在运行时会规划 vanilla JS。但重载版本也绝对没问题。这是设计选择和维护。就个人而言,我会坚持使用泛型,因为它只是一种类型,并且至少在打字稿方面与任何类型相同。
    【解决方案2】:

    添加所有签名/重载

        public getData(url: string, headers?: HttpHeaders): Observable<any>;
        public getData<T>(url: string, headers?: HttpHeaders): Observable<T>;
        public getData<T>(url: string, headers?: HttpHeaders): Observable<T> | Observable<any> {
            this.customReqOptions = this.getHeaders(headers);
            return this.httpClient.get(`${this.endPoint}${url}`, { headers: this.customReqOptions});
        }
    

    在 VScode(运行/编译)中也没有问题。不确定天气是否是一个好习惯。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-29
      • 2021-08-22
      • 2019-08-28
      • 2020-11-07
      • 2018-10-22
      • 2021-08-23
      • 1970-01-01
      相关资源
      最近更新 更多