#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) => {
.