So I am looking at some code where they made an HttpClient to use for an API, I can see there's a smell extending the Axios class without using its constructor, seemingly creating one extra Axios instance that doesn't need to exist, I can see some more memory usage, but other than that, I can't explain why it's so smelly except my intuition, here's the code :
export class BaseApiOriginal extends Axios {
instance: AxiosInstance
constructor() {
super()
this.instance = axios.create({
baseURL: baseURL
})
}
static async build() {
const baseApi = new BaseApiOriginal()
let headers: Partial<AxiosHeaders> = {
'Content-Type': 'application/json'
}
console.log(baseApi)
baseApi.instance.defaults.headers.common = { ...headers }
baseApi.instance.interceptors.request.use(
(request) => request,
(error) => {
return Promise.reject(error)
}
)
baseApi.instance.interceptors.response.use(
(response) => response,
async (error) => {
await Promise.reject(error)
}
)
return baseApi
}
// Axios Super
static async getInstance() {
const instance = await BaseApiOriginal.build()
return instance.instance
}
static async getUri(config?: AxiosRequestConfig): Promise<string> {
const instance = await BaseApiOriginal.build()
return instance.instance.getUri(config)
}
static async request<T = any, R = AxiosResponse<T>, D = any>(config: AxiosRequestConfig<D>): Promise<R> {
const instance = await BaseApiOriginal.build()
return instance.instance.request<T, R, D>(config)
}
static async get<T = any, R = AxiosResponse<T>, D = any>(url: string, config?: AxiosRequestConfig<D>): Promise<R> {
const instance = await BaseApiOriginal.build()
return instance.instance.get<T, R, D>(url, config)
}
static async delete<T = any, R = AxiosResponse<T>, D = any>(url: string, config?: AxiosRequestConfig<D>): Promise<R> {
const instance = await BaseApiOriginal.build()
return instance.instance.delete<T, R, D>(url, config)
}
static async head<T = any, R = AxiosResponse<T>, D = any>(url: string, config?: AxiosRequestConfig<D>): Promise<R> {
const instance = await BaseApiOriginal.build()
return instance.instance.head<T, R, D>(url, config)
}
static async options<T = any, R = AxiosResponse<T>, D = any>(
url: string,
config?: AxiosRequestConfig<D>
): Promise<R> {
const instance = await BaseApiOriginal.build()
return instance.instance.options<T, R, D>(url, config)
}
static async post<T = any, R = AxiosResponse<T>, D = any>(
url: string,
data?: D,
config?: AxiosRequestConfig<D>
): Promise<R> {
const instance = await BaseApiOriginal.build()
return instance.instance.post<T, R, D>(url, data, config)
}
static async put<T = any, R = AxiosResponse<T>, D = any>(
url: string,
data?: D,
config?: AxiosRequestConfig<D>
): Promise<R> {
const instance = await BaseApiOriginal.build()
return instance.instance.put<T, R, D>(url, data, config)
}
static async patch<T = any, R = AxiosResponse<T>, D = any>(
url: string,
data?: D,
config?: AxiosRequestConfig<D>
): Promise<R> {
const instance = await BaseApiOriginal.build()
return instance.instance.patch<T, R, D>(url, data, config)
}
static async postForm<T = any, R = AxiosResponse<T>, D = any>(
url: string,
data?: D,
config?: AxiosRequestConfig<D>
): Promise<R> {
const instance = await BaseApiOriginal.build()
return instance.instance.postForm<T, R, D>(url, data, config)
}
}