Ошибка TS2345: указание типа параметра функции

#typescript #rxjs

#typescript #rxjs

Вопрос:

Почему следующий код приводит к приведенной ниже ошибке?

Код:

 const queryApi = (request: AxiosRequestConfig): Observable<ParsedData> => {
  return new Observable(observer => {
      axios(request).then(response => {
          observer.next(response);
          observer.complete();
      }).catch(error => {
          observer.error(error);
      })
     // Asserting value type causes error.
  }).pipe(map((value: AxiosResponse) => {
      const parser = new Parser(name);
      return parser.parse(value.data);
  }));
}
  

Сообщение об ошибке:

 TS2345: Argument of type 'OperatorFunction<AxiosResponse<any>, Observable<ParsedData>>' is not assignable to parameter of 'OperatorFunction<{}, Observable<ParsedData>'. Type '{}' is missing the following properties from  type 'AxiosResponse<any>': data, status, statusText, headers, config
  

Если я добавлю утверждение типа const response = value as AxiosResponse , код компилируется (см. Ниже).

Альтернативный код:

 const queryApi = (request: AxiosRequestConfig): Observable<ParsedData> => {
  return new Observable(observer => {
      axios(request).then(response => {
          observer.next(response);
          observer.complete();
      }).catch(error => {
          observer.error(error);
      })
  }).pipe(map(value => {
      const parser = new Parser(name);
      const response = value as AxiosResponse;
      return parser.parse(response.data);
  }));
}
  

Определения:
Определения Axios.

 export interface AxiosRequestConfig {
  url?: string;
  method?: Method;
  baseURL?: string;
  transformRequest?: AxiosTransformer | AxiosTransformer[];
  transformResponse?: AxiosTransformer | AxiosTransformer[];
  headers?: any;
  params?: any;
  paramsSerializer?: (params: any) => string;
  data?: any;
  timeout?: number;
  withCredentials?: boolean;
  adapter?: AxiosAdapter;
  auth?: AxiosBasicCredentials;
  responseType?: ResponseType;
  xsrfCookieName?: string;
  xsrfHeaderName?: string;
  onUploadProgress?: (progressEvent: any) => void;
  onDownloadProgress?: (progressEvent: any) => void;
  maxContentLength?: number;
  validateStatus?: (status: number) => boolean;
  maxRedirects?: number;
  socketPath?: string | null;
  httpAgent?: any;
  httpsAgent?: any;
  proxy?: AxiosProxyConfig | false;
  cancelToken?: CancelToken;
}

export interface AxiosResponse<T = any>  {
  data: T;
  status: number;
  statusText: string;
  headers: any;
  config: AxiosRequestConfig;
  request?: any;
}

export interface ParsedData {
  [key: string]: any;
}
  

Комментарии:

1. Не могли бы вы вставить определения AxiosRequestConfig, AxiosResponse и ParsedData

2. @PrzemyslawPietrzak Я добавил определения к сообщению.

3. спасибо, и скажите мне, что строка witch выдает ошибку

4. @PrzemyslawPietrzak Следующая строка вызывает ошибку: pipe(map((value: AxiosResponse) => ... ; проблема, по-видимому, заключается в утверждении, что value имеет тип AxiosResponse .

Ответ №1:

В этой строке }).pipe(map((value: AxiosResponse) => { вы указали TS, что это значение имеет тип AxiosResponse. Вам не нужно вводить обратные вызовы в TS, например, [1,2,3].map(x => x 1) здесь TS знает, что x — это число. Если вы хотите сообщить TS, что observable содержит AxiosResponse от generic. return new Observable<AxiosResponse>(observer => { и удалите тип в обратном вызове map ).pipe(map((value) => { .