Búsqueda de sitios web

Interceptores de Axios con Typescript


Cómo usar correctamente los interceptores de axios con TypeScript:

import axios, { AxiosRequestConfig, AxiosInstance } from 'axios'

HTTP.interceptors.request.use((config: AxiosRequestConfig) => config)

Por ejemplo, cuando creo una instancia de axios, configuro la configuración predeterminada:

const conf: AxiosRequestConfig = {
  baseURL: process.env.VUE_APP_API_URL
}

const HTTP: AxiosInstance = axios.create(conf)

Pero cuando intento usar el interceptor con encabezados personalizados:

HTTP.interceptors.request.use((config: AxiosRequestConfig) =>{
  headers: {
    'x-projectkey': 1234
  }
})

No funciona:

Argument of type '(config: AxiosRequestConfig) => void' is not assignable to parameter of type '(value: AxiosRequestConfig) => AxiosRequestConfig | Promise<AxiosRequestConfig>'

Todavía soy nuevo en TS, no puedo entender esto.

Respuesta #1

Ve a la definición de tipo de AxiosRequestConfig, puedes ver que todo, incluidos los encabezados de axios, es opcional:

interface AxiosRequestConfig<D = any> {
  url?: string;
  method?: Method | string;
  baseURL?: string;
  timeout?: number;
  timeoutErrorMessage?: string;
  withCredentials?: boolean;
  // ... omited 
}

Al crear un axiosInstance y agregar configuración, se debe devolver el config para que la instancia adopte la configuración:

const axiosInstance = axios.create();

axiosInstance.interceptors.request.use((config) => {
  if (config.headers) { // <- adding a check 
    config.headers["x-projectkey"] = 1234; // no errors
  }
  config.withCredentials = true; // to include credential, it should be outside of "if" block 
  return config;
});

Entonces, en cada solicitud que hagas con el axiosInstance, incluirá el encabezado x-projectkey y las credenciales:

axiosInstance.get("url");

Respuesta #2

Deberías devolver la configuración como se muestra a continuación:

HTTP.interceptors.request.use((config: AxiosRequestConfig) => {
  config.headers['x-projectkey'] = 1234

  return config
})

Diviértete.

Artículos relacionados