import { AxiosResponse, AxiosRequestConfig, InternalAxiosRequestConfig, AxiosInstance } from 'axios';

interface IAppInterceptors<T = AxiosResponse> {
    requestSuccessFn?: (config: AxiosRequestConfig) => InternalAxiosRequestConfig | any;
    requestFailureFn?: (err: any) => any;
    responseSuccessFn?: (res: T) => T;
    responseFailureFn?: (err: any) => any;
}
interface IAppRequestConfig<T = AxiosResponse> extends Partial<InternalAxiosRequestConfig> {
    interceptors?: IAppInterceptors<T>;
}
/**
 * AppRequest类
 * @class AppRequest
 * @param {IAppRequestConfig} config
 * @description AppRequest类
 * @example
 * ```js
 *  const request = new AppRequest({
 *    baseURL: '',
 *    timeout: 5000,
 *    interceptors: {
 *      requestSuccessFn(cfg) {
 *        return cfg
 *      },
 *      requestFailureFn(){},
 *      responseSuccessFn(){},
 *      responseFailureFn(){}
 *    }
 *  })
 * ```
 */
declare class AppRequest {
    instance: AxiosInstance;
    constructor(config: IAppRequestConfig);
    request<T = any>(config: IAppRequestConfig<T>): Promise<T>;
    get<T = any>(config: IAppRequestConfig<T>): Promise<T>;
    post<T = any>(config: IAppRequestConfig<T>): Promise<T>;
    delete<T = any>(config: IAppRequestConfig<T>): Promise<T>;
    patch<T = any>(config: IAppRequestConfig<T>): Promise<T>;
    put<T = any>(config: IAppRequestConfig<T>): Promise<T>;
}

type request_AppRequest = AppRequest;
declare const request_AppRequest: typeof AppRequest;
type request_IAppInterceptors<T = AxiosResponse> = IAppInterceptors<T>;
type request_IAppRequestConfig<T = AxiosResponse> = IAppRequestConfig<T>;
declare namespace request {
  export { request_AppRequest as AppRequest, type request_IAppInterceptors as IAppInterceptors, type request_IAppRequestConfig as IAppRequestConfig, AppRequest as default };
}

export { AppRequest as A, type IAppInterceptors as I, type IAppRequestConfig as a, request as r };
