import { ConstructorOf } from '@lancercomet/types';
interface IApiResponse<T = unknown> {
    data: T;
    code: number;
    message: string;
}
interface IFetchResult<T, E = Error> {
    data: T | undefined;
    error: E | undefined;
    status: number;
}
interface IFetcherApiResult<T, E = Error> extends IFetchResult<T, E> {
    message: string;
    code: number;
}
interface IFetcherOptions {
    cache?: RequestCache;
    credentials?: RequestCredentials;
    headers?: HeadersInit;
    redirect?: RequestRedirect;
    referrerPolicy?: ReferrerPolicy;
}
interface IFetcherRequestParam {
    url: string;
    method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'OPTION';
    data?: Record<string | number, unknown> | FormData;
    options?: IFetcherOptions;
}
interface IFetcherRequestJSONParam<T> extends IFetcherRequestParam {
    type?: ConstructorOf<(T extends (infer P)[] ? P : T)>;
}
interface IFetcher {
    /**
     * Base url.
     *
     * @default undefined
     */
    baseUrl?: string;
    /**
     * Timeout.
     *
     * @default undefined
     */
    timeout?: number;
}
declare type Interceptor = (param: IFetcherRequestParam) => IFetcherRequestParam;
/**
 * Fetcher.
 *
 * @class Fetcher
 */
declare class Fetcher {
    private _param?;
    private _interceptors;
    private _abortController;
    private _createParamByInterceptors;
    /**
     * Abort requesting.
     */
    abort(): void;
    /**
     * Add a function to intercept the request.
     *
     * @param {Interceptor} func The interceptor function.
     * @returns {() => void} The function to remove the interceptor.
     */
    setInterceptor(func: Interceptor): () => void;
    private _request;
    /**
     * Send Http request and read the response as JSON.
     *
     * @template T
     * @param {IFetcherRequestParam<T>} param
     */
    requestJSON<T>(param: IFetcherRequestJSONParam<T>): Promise<IFetchResult<T>>;
    /**
     * Send http request and read the response as "The API".
     *
     * @param param
     */
    requestAPI<T>(param: IFetcherRequestJSONParam<T>): Promise<IFetcherApiResult<T>>;
    /**
     * Send http request and read the response as ArrayBuffer.
     *
     * @param param
     * @param type
     */
    requestBinary(param: IFetcherRequestParam, type: 'arraybuffer'): Promise<IFetchResult<ArrayBuffer>>;
    requestBinary(param: IFetcherRequestParam, type: 'blob'): Promise<IFetchResult<Blob>>;
    constructor(param?: IFetcher);
}
export { Fetcher, IApiResponse, IFetchResult, IFetcherApiResult, IFetcherOptions, IFetcherRequestParam, IFetcherRequestJSONParam, IFetcher, Interceptor };
