TS2345错误:指定功能参数类型

时间:2019-03-28 20:30:11

标签: 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 definitions.

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 个答案:

答案 0 :(得分:0)

}).pipe(map((value: AxiosResponse) => {行中,您告诉TS值是AxiosResponse类型。您不必在TS中键入回调,例如[1,2,3].map(x => x + 1)在这里TS知道x是数字。如果您想告诉TS,可观察的对象包含通用的AxiosResponse。 return new Observable<AxiosResponse>(observer => {并删除地图回调).pipe(map((value) => {中的类型。