axios-miniprogram/src/core/createInstance.ts

81 lines
2.0 KiB
TypeScript

import { combineURL } from '../helpers/combineURL';
import { buildURL } from '../helpers/buildURL';
import Axios, {
AxiosRequest,
AxiosRequestConfig,
AxiosRequestHeaders,
} from './Axios';
import { mergeConfig } from './mergeConfig';
/**
* axios 实例默认配置
*/
export interface AxiosInstanceDefaults extends AxiosRequestConfig {
/**
* 请求头
*/
headers: Required<AxiosRequestHeaders>;
}
/**
* axios 实例
*/
export interface AxiosInstance extends AxiosRequest, Axios {
/**
* 默认请求配置
*/
defaults: AxiosInstanceDefaults;
/**
* 获取 URI
*
* @param config 默认配置
*/
getUri(config: AxiosRequestConfig): string;
/**
* 创建 axios 实例
*
* @param config 默认配置
*/
create(config?: AxiosRequestConfig): AxiosInstance;
/**
* 扩展实例
*
* @param config 默认配置
*/
extend(config: AxiosRequestConfig): AxiosInstance;
/**
* 派生领域
*
* @param config 默认配置
*
* @deprecated 请使用 extend 替换 fork
*/
fork(config: AxiosRequestConfig): AxiosInstance;
}
export function createInstance(config: AxiosRequestConfig, parent?: Axios) {
const context = new Axios(config, parent);
const instance = context.request as AxiosInstance;
instance.getUri = function getUri(config: AxiosRequestConfig) {
const { url, params, paramsSerializer } = mergeConfig(
instance.defaults,
config,
);
return buildURL(url, params, paramsSerializer).replace(/^\?/, '');
};
instance.create = function create(config) {
return createInstance(mergeConfig(instance.defaults, config));
};
instance.extend = function extend(config: AxiosRequestConfig = {}) {
config.baseURL = combineURL(instance.defaults.baseURL, config.baseURL);
return createInstance(mergeConfig(instance.defaults, config), context);
};
instance.fork = instance.extend;
Object.assign(instance, context);
Object.setPrototypeOf(instance, Axios.prototype);
return instance;
}