以下代码为什么导致以下错误?
代码:
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);
}));
}
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;
}
答案 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) => {
中的类型。