Axios: рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ (AxiosResponse рд╕рдорд╕реНрдпрд╛) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде Axios рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 30 рдЕрдкреНрд░реИрд▓ 2018  ┬╖  50рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: axios/axios

рд╕рд╛рд░рд╛рдВрд╢

рдПрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдореИрдВ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ (рдЯреАрдПрд╕) рдореЗрдВ рдорд╛рдЗрдЧреНрд░реЗрдЯ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рд╣реИ r => r.data ред рдореИрдВ TS рдХреЛ рдХреИрд╕реЗ рд╕реВрдЪрд┐рдд рдХрд░реВрдБ рдХрд┐ рдореИрдВ AxiosResponse рдкреНрд░рдХрд╛рд░ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ? рдореИрдВрдиреЗ as Array<... рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ AxiosResponse рдХреЛ Array рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рдбрд╛рд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд▓рдВрдмрд╛рдИ рдирд╣реАрдВ рд╣реИ)ред

рдзрдиреНрдпрд╡рд╛рдж!

рд╕рдВрджрд░реНрдн

  • рдЕрдХреНрд╖ рд╕рдВрд╕реНрдХрд░рдг: 0.16.2
  • рдкрд░реНрдпрд╛рд╡рд░рдг: рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рдХреЛрдб

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдореИрдВ рдЕрдкрдиреЗ axios.d.ts рдореЗрдВ AxiosResponse рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддрд╛ рд╣реВрдВ:

import axios from 'axios'

declare module 'axios' {
  export interface AxiosResponse<T = any> extends Promise<T> {}
}

рд╕рднреА 50 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

axios.request<T>(...args) рд╢реИрд▓реА рдкрд░рд┐рднрд╛рд╖рд╛ рдХрд╛ рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВред
рд╕рд░рдгреА рдореЗрдВ рдЕрдВрддрд┐рдо рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдкрд░реЛрдХреНрд╖ рд░реВрдк рд╕реЗ (currentResponse: any) => T рдЬреИрд╕реЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЕрдиреБрдкрд╛рд▓рди рдХрд░рддрд╛ рд╣реИ

рддреЛ рдЕрдЧрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ data рдХреБрдЫ рдРрд╕рд╛ рд╣реИ:

interface ServerResponse {
  data: ServerData
}

interface ServerData {
  foo: string
  bar: number
}

рддрдм рдЖрдк рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ:

axios.request<ServerData>({
  url: 'https://example.com/path/to/data',
  transformResponse: (r: ServerResponse) => r.data
}).then((response) => {
  // `response` is of type `AxiosResponse<ServerData>`
  const { data } = response
  // `data` is of type ServerData, correctly inferred
})

@zcei рдКрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рд╡реИрд╢реНрд╡рд┐рдХ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдЬреИрд╕реЗ axios.interceptors.response.use

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд░рддрд╛ рд╣реИ - рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдмрд╣реБрдд "рдЖрд░рд╛рдо рд╕реЗ" рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рд╣реИрдВ (рдЙрд░реНрдл any ), рдЗрд╕рд▓рд┐рдП рдЖрдк рдХреЗрд╡рд▓ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рд╕рдВрд▓рдЧреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ (r: any): any => r.data (рдЬреЛ рдореВрд▓ рд░реВрдк рд╕реЗ рдРрд╕рд╛ рд╣реИ рдЬреИрд╕реЗ рдЖрдк рдЧреИрд░-рд╕рдЦреНрдд рдореЛрдб рдореЗрдВ рдХрд┐рд╕реА рднреА рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВ)ред

рдХреЗрд╡рд▓ рдЙрд╕ рдмрд┐рдВрджреБ рдкрд░ рдЬрд╣рд╛рдВ рдЖрдк axios.request рдкрд░ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рдЖрдк рдЗрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рддрдм data рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

(рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореИрдВрдиреЗ рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдореЗрдВ рдЧрд▓рддреА рдХреА рд╣реИ, data рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ AxiosResponse<ServerData> рд╣реИ рдЬрд┐рд╕рдореЗрдВ .data рдирд╛рдордХ рдПрдХ рдлрд╝реАрд▓реНрдб рд╣реИ рдЬрд┐рд╕рдореЗрдВ ServerData рдкреНрд░рдХрд╛рд░ рд╣реИ - рдЗрд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛)

@zcei рд╣рд╛рдп рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореЗрд░реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдореИрдВрдиреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЛрдбрд╕реИрдВрдбрдмреЙрдХреНрд╕ рдмрдирд╛рдпрд╛ рд╣реИред

рдпрд╣рд╛рдВ рдЗрд╕рдХреА рдЬрд╛рдВрдЪ рдХреАрдЬрд┐рдП

рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реЛрдиреЗ рдкрд░, рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдХреЛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдЙрдмрд╛рд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

this.instance.interceptors.response.use(response => response.data);

рдЗрд╕рдХреЗ рдмрд╛рд╡рдЬреВрдж, рд╡рд╛рдкрд╕реА рдкреНрд░рдХрд╛рд░

this.instance.post<string>(...);

AxiosPromise<string> рд╣реИ, рдЬреЛ рдбреЗрдЯрд╛ рдХреЛ рд▓рдкреЗрдЯреЗ рдЬрд╛рдиреЗ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИред

рдпрд╣ рдЬрд╛рдирдмреВрдЭрдХрд░ рд╣реИред рдЖрдкрдХреЛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рдмрджрд▓рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреБрдВрдЬреА рдХреЛ рдлрд╣рд░рд╛рдирд╛ рдирд╣реАрдВ рд╣реИред

https://github.com/axios/axios/blob/0b3db5d87a60a1ad8b0dce9669dbc10483ec33da/lib/core/dispatchRequest.js#L63 -L67

рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рд╕рд░реНрд╡рд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╣реЛрдЧреА рдЬреИрд╕реЗ

{
  "data": {
    "foo": 42
  }
}

рдФрд░ response.data.data рдиреЗрд╕реНрдЯрд┐рдВрдЧ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдпрджрд┐ рдЖрдк рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдореЗрдВ response.data рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдмрд╛рдж рдореЗрдВ рдЗрд╕реЗ response.data.data.foo рдХреЗ рдмрдЬрд╛рдп response.data.data.foo response.data.foo рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд▓реЗрдХрд┐рди response.foo рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдЪрд▓реЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ "рд░реВрдЯ" рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реНрддрд░ рд╣реИ рдЬреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛрдб рдФрд░ рд╕рдорд╛рди рдЬреИрд╕реЗ рдЕрдиреНрдп рд╕рд╛рдорд╛рдиреЛрдВ рдХрд╛ рдЯреНрд░реИрдХ рд░рдЦрддрд╛ рд╣реИред

рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдЖрдкрдХреЗ рдЖрдзрд╛рд░ рд╕реЗ рд╕рд╣рдордд рдирд╣реАрдВ рд╣реВрдВ, рдХрдо рд╕реЗ рдХрдо рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛-рд╡рд╛рд░ рддреЛ рдирд╣реАрдВред
рдбреЗрдЯрд╛ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛, рдореБрдЭреЗ рдХрд░рдирд╛ рд╣реЛрдЧрд╛

this.instance.post<string>(...).then(response => response.data);
this.instance.get<number>(...).then(response => response.data);

_every_ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдореЗрдВ рдЬрд┐рд╕реЗ рдореИрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реВрдВред рдЙрд╕ рд╕рднреА рдХреЛрдб рджреЛрд╣рд░рд╛рд╡ рдореЗрдВ рдХреНрдпрд╛ рдмрд╛рдд рд╣реИ?

рдЬрдм рднреА рдХреЛрдИ рдЕрдиреБрд░реЛрдз рд╕рдлрд▓ рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ then рдХрд╛ рдЕрд░реНрде рд╣реИ, рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛрдб рдЖрджрд┐ рдХреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рдХреЗрд╡рд▓ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛрдб рдХреА рдкрд░рд╡рд╛рд╣ рд╣реИ рдпрджрд┐ рдХреБрдЫ _didn't_ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрд╣реА рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ рд╣реИрдВ , рджреЛрдиреЛрдВ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдкрд░ рдФрд░ рд╕рд╛рде рд╣реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБрдУрдВ рдкрд░ред

this.instance.interceptors.response.use(response => {
  // Everything went well, pass only relevant data through
  return response.data;
}, error => {
  // Something went wrong, figure out how to handle it here or in a `.catch` somewhere down the pipe
});

рдЬрдм рднреА рдХреЛрдИ рдЕрдиреБрд░реЛрдз рд╕рдлрд▓ рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рддрддреНрдХрд╛рд▓реАрди рдЕрд░реНрде рд╣реЛрддрд╛ рд╣реИ, рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛрдб рдХреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИ

рдареАрдХ рд╣реИ, рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдХрд┐рд╕реА рдЕрдиреНрдп рдЬрд╛рдирдХрд╛рд░реА рдХреА рдкрд░рд╡рд╛рд╣ рди рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди HTTP рдХреНрд▓рд╛рдЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рддреНрдпреЗрдХ рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдпрд╣ рдмрд╛рдзреНрдп рдХрд░рдирд╛ рдХрд┐ рдЖрдк рдХреЗрд╡рд▓ рд╢рд░реАрд░ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд░рддреЗ рд╣реИрдВ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдИ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИред
рд╕рдлрд▓ рдХреЙрд▓ рдкрд░ рднреА рд╕реНрдЯреЗрдЯрд╕ рдХреЛрдб рдФрд░ рд╣реЗрдбрд░ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдХрд╛рдиреВрдиреА рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рд╣реИрдВред рдЬреИрд╕реЗ 204 рдмрдирд╛рдо 200 рдкрд░ рднреЗрдж рдХрд░рдирд╛, рджрд░ рд╕реАрдорд╛ рд╣реЗрдбрд░ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛, рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрд╕рд╛рдзрдиреЛрдВ (рдкреЗрдЬрд┐рдиреЗрд╢рди) рдХреЗ рд▓рд┐рдП Link рд╣реЗрдбрд░ рдирд┐рдХрд╛рд▓рдирд╛ рдЖрджрд┐ред рдкреАрдкреАред

рдпрджрд┐ рдЖрдкрдХреЛ рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИ, рддреЛ Axios рд▓рдкреЗрдЯреЗрдВ рдФрд░ рд╕рдм рдХреБрдЫ рдлреЗрдВрдХ рджреЗрдВ:

this.instance.request = <T>(...args) => {
  return axios.request<T>(...args).then(({ data }) => data)
}

this.instance.request<string>({ method: 'post', ... }).then(data => { ... });
this.instance.request<number>({ method: 'get', ... }).then(data => { ... });

рдореИрдВ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдЖрдкрдХреЛ рдпрд╣ рдзрд╛рд░рдгрд╛ рдХрд╣рд╛рдВ рд╕реЗ рдорд┐рд▓реА рдХрд┐ рд╣рд░ рдХрд┐рд╕реА рдХреЛ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреИрд╕реЗ рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдПрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдХрд░рддрд╛ рд╣реВрдВред рдореИрдВ рдмрд╕ рд╣рд░ рдЕрдиреБрд░реЛрдз рдкрд░ рдбреЗрдЯрд╛ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЦреЛрд▓рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдореЗрд░реЗ рд╕рд╛рдордиреЗ рдереА, рдореИрдВ рдЙрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рд╛рде рдЕрдХреЗрд▓рд╛ рдирд╣реАрдВ рд╣реВрдВред

рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ _рд╕реАрдо_ рдЗрд╕реЗ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдЬрдЧрд╣ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ, рджреЛрдиреЛрдВ рдЕрдкрдиреЗ рдирд╛рдо рдФрд░ рд░реАрдбрдореА рдореЗрдВ рдЙрдирдХреЗ рд╡рд┐рд╡рд░рдг рд╕реЗ (рд╣рд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрд░реЗрдВ)ред 204 рдмрдирд╛рдо 200 рдЖрджрд┐ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛ рдФрд░ рдлрд┐рд░ рдбреЗрдЯрд╛ рдкрд╛рд╕ рдХрд░рдирд╛ рдПрдХ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдореЗрдВ рднреА рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рддрдм рдЖрдк рдЗрд╕реЗ рдПрдХ рдХреЗрдВрджреНрд░реАрдп рд╕реНрдерд╛рди рдкрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рд╕рд╣рдЬ рд╕рдорд╛рдзрд╛рди рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдЖрдк рдЬреЛ рднреА рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рд╕реЗ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЙрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдВ, рди рдХрд┐ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдмрд▓ рдХреЛ рдПрдХ рд╣реА рддрд░рд╣ рд╕реЗред

рдпрджрд┐ рдЖрдк рдХреБрдЫ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдбреЗрдЯрд╛ рдореЗрдВ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:

this.instance.interceptors.response.use(response => {
  response.data.foo = JSON.parse(response.data.bar);
  return response;
});

рдпрджрд┐ рдЖрдк Axios рдХреЗ рдбреЗрдЯрд╛ рдХреЛ рдЦреЛрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:

this.instance.interceptors.response.use(response => response.data);

рдпрд╣ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ, рдЗрд╕рдХрд╛ рд╡рд┐рдХрд▓реНрдк рдЫреЛрдбрд╝ рджреЗрдЧрд╛, рдЬреЛ рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдмрд╣реБрдд рджреГрдврд╝рддрд╛ рд╕реЗ рд░рд╛рдп рд╡рд╛рд▓реЗ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИред рдмреЗрд╢рдХ, рдЖрдк рдЕрд╕рд╣рдордд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рд╣реИрдВред

рдЖрдк "рдЙрд╕ рд╕рднреА рдХреЛрдб рджреЛрд╣рд░рд╛рд╡ рдореЗрдВ рдмрд┐рдВрджреБ" рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рддрд░реНрдХ рджреЗ рд░рд╣реЗ рдереЗ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рд╕рд┐рд░реНрдл рдпрд╣ рд╕рдордЭрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдХрд┐ рдЬрд╛рдирдХрд╛рд░реА рдХреНрдпреЛрдВ рдЖрд╡рд╢реНрдпрдХ рд╣реИред

рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдИ рд░рд╛рд╕реНрддрд╛ рдирд╣реАрдВ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдЖрдк рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЯрд╛рдЗрдк рд╕реБрд░рдХреНрд╖рд╛ рдХреИрд╕реЗ рд░рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЕрдЧрд░ рдХреЛрдИ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдмрд┐рдирд╛ рдкреВрд░реА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕реНрдХреНрд░реИрдореНрдмрд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИред :/
рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рдХрд╛рд░ рдХреЛ any рдмрдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдФрд░ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд╣рд╛рдереЛрдВ рдореЗрдВ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рд╕рд╣реА рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред

рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо рдПрдХ рд╕рдВрдкрддреНрддрд┐ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ, рдЖрд░рд╛рдо рд╕реЗ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЗ рдХрд╛рд░рдг рдЕрдзрд┐рдХ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╡рдг рд▓рдЧрддрд╛ рд╣реИред

рдпрджрд┐ рдЖрдк рдПрдХ рдкреАрдЖрд░ рдХреЗ рд╕рд╛рде рдЖ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдХреЛ "80% рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓реЛрдВтАЭ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдк рд╕реБрд░рдХреНрд╖рд╛ рд░рдЦрддреЗ рд╣реБрдП рд░реВрдЯ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рдЦреБрд╢реА рд╣реЛрдЧреА!

рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЙрдкрд░реЛрдХреНрдд рджреЛрдиреЛрдВ рдЙрджрд╛рд╣рд░рдг рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рд╡рд░реНрдгрд┐рдд рдХрд┐рдП рд╣реИрдВ, рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рдХреЗрд╡рд▓ рдЧрд▓рдд рдкреНрд░рдХрд╛рд░ рд╣реИрдВред рдпрджрд┐ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдореЗрдВ (рд╕рдВрд╢реЛрдзрд┐рдд) рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреБрдЫ рдФрд░ рд▓реМрдЯрд╛рдирд╛ рдЧрд▓рдд рд╣реИ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд╣рд╛рдВ рдЕрдкреЗрдХреНрд╖рд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдпрд╣ рдЬрд╛рдирдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдХрд┐ рдЖрдк рд╡рд╣реА рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ @Etheryte !

рд╣рдорд╛рд░реЗ рдРрдк рдореЗрдВ r => r.data рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдЕрдВрддрд┐рдо рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рд╣реИ рдФрд░ рд╣рдо рджреВрд╕рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд░реАрдлреНрд░реЗрд╢ рдЯреЛрдХрди рдЖрджрд┐ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреЗрдЯрд╕ рдХреЛрдб рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реИрд╢реНрд╡рд┐рдХ рд╕реНрддрд░ рдкрд░ рд╣рдореЗрдВ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдХреЙрд▓ред

рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдЯреАрдПрд╕ рдХреЗ рд╕рд╛рде рдЗрд╕ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, @zcei рдпрд╣ рдирд┐рд░реНрд╡рд┐рд╡рд╛рдж рд╣реИ рдХрд┐ рдпрд╣ Axios рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╡реИрдз рддрд░реАрдХрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ Axios API (рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░) рдХреЗ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рднрд╛рдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ :)ред

рджреЛрд╣! рдореИрдВ рд╣рд░ рд╕рдордп рдЧрд▓рдд рдХреЛрдб рджреЗрдЦ рд░рд╣рд╛ рдерд╛ тАНтЩВя╕П рдФрд░ transformResponse рд╕реЗрдХреНрд╢рди рдореЗрдВ рдерд╛, рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдирд╣реАрдВ - рдореБрдЭреЗ рдмрд╣реБрдд рдЦреЗрдж рд╣реИ!

рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдмрджрд▓рдиреЗ рд╡рд╛рд▓реЗ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдХреЗ рд▓рд┐рдП рдЖрдк рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЛ рдЦрд╛рддреЗ рдореЗрдВ рдХреИрд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВрдЧреЗ?

рд╢рд╛рдпрдж рдХреБрдЫ рдРрд╕рд╛?

interface AxiosInstance {
  request<T = any, R = AxiosResponse<T>> (config: AxiosRequestConfig): Promise<R>;
}

рдЖрдк рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдХрд╣реЗрдВрдЧреЗ:

axios.request<User, string>({
  method: 'get',
  url: '/user?id=12345'
})
  .then((foo: string) => { // <-- you could leave out the type annotation here, it's inferred
    console.log(foo)
  })

рдмрд╕ рдЗрд╕реЗ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдЖрдЬрд╝рдорд╛рдПрдВ рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдЬреЛ рдЖрдк рдЦреЛрдЬ рд░рд╣реЗ рд╣реИрдВред
рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рд╢рд╛рдо рдХреЛ рдПрдХ рд╕рд╛рде рдкреАрдЖрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХреВрдВ рддрд╛рдХрд┐ рд╕рднреА рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред

@zcei рдпрд╣ рдЕрдЪреНрдЫрд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИ! рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ AxiosResponse рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ 99% рд╕рдордп рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ

рд╕реБрди рдХрд░ рдЦреБрд╢реА рд╣реБрдИ! рдореЗрд░реЗ рднреНрд░рдо рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рдХреНрд╖рдорд╛ рдХрд░реЗрдВ

@zcei рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ! рд░реБрдЪрд┐ рд╕реЗ рдмрд╛рд╣рд░ Axios рдХреЗ рд▓рд┐рдП рд░рд┐рд▓реАрдЬрд╝ рдЪрдХреНрд░ рдХреНрдпрд╛ рд╣реИ?

рдХреЛрдИ рдирд╣реАрдВ рд╣реИ - рдореЗрд░реЗ рдкрд╛рд╕ рдЕрднреА рднреА v1 рдЕрд▓реНрдлрд╛ (#1333) рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд▓рдВрдмрд┐рдд рдЪреАрдЬреЗрдВ рд╣реИрдВ рдФрд░ рдЗрд╕ рдмреАрдЪ @nickuraltsev / @emilyemorehouse рдЬрдм рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рд░рд┐рд▓реАрдЬ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
v0.18 рдХреЗ рдмрд╛рдж рд╕реЗ рдХреБрдЫ рдХрд░реНрд╖рдг рд╣реБрдЖ рд╣реИ (рдореЗрд░реЗ рдкрд╕рдВрджреАрджрд╛ рд╕рд╣рд┐рдд: рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрдХреЛрдкрд┐рдВрдЧ рд╡рд┐рдХрд▓реНрдк) рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдПрдХ рд░рд┐рд▓реАрдЬ рдореЗрдВ рдХрдЯреМрддреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдореИрдВ рдЖрдкрдХреЛ Gitter рдкрд░ рдЖрдордВрддреНрд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рддрд╛рдХрд┐ рд╣рдо рдореБрджреНрджреЛрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ

рдореИрдВ 0.19 рд░рд┐рд▓реАрдЬ рдкрд╛рдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░ рд░рд╣рд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЖрдЦрд┐рд░реА рдмрд╛рд░ рдореИрдВрдиреЗ рдЬрд╛рдВрдЪ рдХреА, рдорд╛рд╕реНрдЯрд░ рд╕реАрдЖрдИ рдореЗрдВ рдЕрд╕рдлрд▓ рд░рд╣рд╛ рдерд╛ред 1.0 рдХреЛ рд▓реИрдВрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдЕрдзрд┐рдХ рдареЛрд╕/рдирд┐рдпрдорд┐рдд рд░рд┐рд▓реАрдЬ рд╢реЗрдбреНрдпреВрд▓ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдорд┐рд▓реЛред рдХреНрдпрд╛ рдХреЛрдИ рд╕рдорд╛рдзрд╛рди рд╣реИрдВ?

@qidaneix рдЖрдк рд░рд┐рд▓реАрдЬрд╝ рд╣реЛрдиреЗ рддрдХ npm install axios/axios#master рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред #1605 рдЗрд╕реЗ рдареАрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛ред рдХреБрдЫ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рдХреНрдпрд╛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬреАрд╡рди рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ рдФрд░ рди рдХреЗрд╡рд▓ рдкрд░реАрдХреНрд╖рдг ЁЯЩВ

@zcei рдореИрдВ рдХрд▓ рдЗрд╕реЗ рдЖрдЬрд╝рдорд╛рдЙрдВрдЧрд╛

@zcei рдХреНрдпрд╛ рдореИрдВ рдкреВрдЫ рд╕рдХрддрд╛ рд╣реВрдБ рдХрд┐ рдпрд╣ рдХрдм рд░рд┐рд▓реАрдЬрд╝ рд╣реЛрдЧреА?

+1 1.0.0 рдХрдм рд░рд┐рд▓реАрдЬрд╝ рд╣реЛрдЧреА?

рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ 1.0 рд╕реЗ рдкрд╣рд▓реЗ рдХреА рд░рд┐рд▓реАрдЬрд╝ рд╣реЛрдЧреАред @рдЦрд╛рд▓реЗрджрдЧрд░рдмрд╛рдпрд╛ рдХреНрдпрд╛ рдЖрдкрдХреЛ рдореИрдЯ рджреНрд╡рд╛рд░рд╛ рднреА рдПрдирдкреАрдПрдо рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛? рдЕрдиреНрдпрдерд╛ рд╣рдореЗрдВ рдЗрд╕реЗ рдЬрд╛рд░реА рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╢реЗрд╖ рдЕрдиреБрд░рдХреНрд╖рдХреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ

рд╕рднреА рдХреЛ рдкреНрд░рдгрд╛рдоред рдореИрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ NPM рд░рд┐рд▓реАрдЬрд╝ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░ рд░рд╣рд╛ рд╣реВрдБред рдореИрдВ рдПрдХ рдФрд░ рдкреВрд░реНрд╡-1.0.0 рд░рд┐рд▓реАрдЬ рдЬрд╛рд░реА рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдЯреНрд░реИрд╡рд┐рд╕ рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдлрд▓ рд╣реЛ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдореБрдЭреЗ рдЕрднреА рддрдХ рдЙрдиреНрд╣реЗрдВ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рдореМрдХрд╛ рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИред рдПрдХ рдмрд╛рд░ рдЬрдм рд╡реЗ рдареАрдХ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдореБрдЭреЗ рдЗрд╕реЗ рддреБрд░рдВрдд рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рдиреЗ рдореЗрдВ рдмрд╣реБрдд рдЦреБрд╢реА рд╣реЛрддреА рд╣реИ

@zcei рдореБрдЭреЗ npm рд░реЗрдкреЛ рдореЗрдВ рдирд╣реАрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛, рдореИрдВ рдХреЗрд╡рд▓ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдорд░реНрдЬ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдБ

рдХреНрдпрд╛ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдХреЛрдИ рдЕрдкрдбреЗрдЯ рд╣реИ, рдХреНрдпрд╛ рдирд┐рдХрдЯ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдорд╣реАрдиреЗ-рджреЛ рдХреА рддрд░рд╣ рдХреЛрдИ рд░рд┐рд▓реАрдЬрд╝ рд╣реЛрдЧреА?

+1

тЭдя╕П рдЕрдЧрд░ рдЗрд╕реЗ рдЕрднреА рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

рд╣рдо рдЬрд╛рдЧрд░реВрдХ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЕрд╡рд░реБрджреНрдз рд╣реИрдВред ЁЯЩБ рдЖрдк рдпрд╣рд╛рдБ рдкрд░ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: https://github.com/axios/axios/issues/1657#issuecomment -410766031

0.19.0-рдмреАрдЯрд╛.1 рдХреЗ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ред

рдЗрд╕реЗ npm install [email protected] рдпрд╛ npm install axios@next . рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

рд╢рд╛рдпрдж рдХреБрдЫ рдРрд╕рд╛?

interface AxiosInstance {
  request<T = any, R = AxiosResponse<T>> (config: AxiosRequestConfig): Promise<R>;
}

рдЖрдк рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдХрд╣реЗрдВрдЧреЗ:

axios.request<User, string>({
  method: 'get',
  url: '/user?id=12345'
})
  .then((foo: string) => { // <-- you could leave out the type annotation here, it's inferred
    console.log(foo)
  })

рдмрд╕ рдЗрд╕реЗ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдЖрдЬрд╝рдорд╛рдПрдВ рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдЬреЛ рдЖрдк рдЦреЛрдЬ рд░рд╣реЗ рд╣реИрдВред
рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рд╢рд╛рдо рдХреЛ рдПрдХ рд╕рд╛рде рдкреАрдЖрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХреВрдВ рддрд╛рдХрд┐ рд╕рднреА рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ (рдЯреА, рдкрд╣рд▓рд╛ рд╕рд╛рдорд╛рдиреНрдп рдкрд░рдо) рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрдЧрд░ рдореИрдВ рдХрд╕реНрдЯрдо рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рддреЛ рдореБрдЭреЗ рдЕрдЬреАрдм рд▓рдЧ рд░рд╣рд╛ рд╣реИ

axios.request<void, string>({
    ...
})

рд╢реВрдиреНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

@emilyemorehouse рдХреГрддрдШреНрди рдирд╣реАрдВ рд▓рдЧ рд░рд╣рд╛ рд╣реИ рд▓реЗрдХрд┐рди 0.19-рдмреАрдЯрд╛ рдЕрдм рддреАрди рдорд╣реАрдиреЗ рдХреЗ рд▓рд┐рдП рдЦреБрд▓рд╛ рд╣реИ, рдХреНрдпрд╛ рдЬреАрдП рд░рд┐рд▓реАрдЬ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдИрдЯреАрдП рд╣реИ? рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЗрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рд╕рдорд╛рдзрд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореИрдВрдиреЗ рдЗрд╕реЗ Gitter рдЪреИрдирд▓ рдореЗрдВ рдкреВрдЫрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЕрдиреБрд░рдХреНрд╖рдХ рд╡рд╣рд╛рдБ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрддреЗ рд╣реИрдВ ...

рд╢рд╛рдпрдж рдПрдХ рдмреЗрд╣рддрд░ рд╢рдмреНрдж рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рд╡реЗ рдХреМрди рд╕реЗ рдореБрджреНрджреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд░рд┐рд▓реАрдЬрд╝ рд╕реЗ рдкрд╣рд▓реЗ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдХреНрдпрд╛ рдЗрд╕реЗ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЬрдЧрд╣ рд╣реИ? рдЪреВрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдмрд╣реБрдд рд░реБрдЪрд┐ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ, рдХрд╛рд░реНрдп рдХреЛ рдлреИрд▓рд╛рдирд╛ рдФрд░ рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдп рдХреА рд╕реНрдкрд╖реНрдЯ рд╕рдордЭ рд╣реЛрдиреЗ рд╕реЗ рдЪреАрдЬреЛрдВ рдХреЛ рдЧрддрд┐ рджреЗрдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓ рд╕рдХрддреА рд╣реИред

0.19 рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореАрд▓ рдХрд╛ рдкрддреНрдерд░ рд╣реИ, рд▓реЗрдХрд┐рди рд╕реВрдЪреАрдмрджреНрдз рдЯрд┐рдХрдЯреЛрдВ рдореЗрдВ рдХрдИ рдорд╣реАрдиреЛрдВ рд╕реЗ рдХреЛрдИ рдмрджрд▓рд╛рд╡ рдирд╣реАрдВ рджреЗрдЦрд╛ рдЧрдпрд╛ рд╣реИред

const func1: рдХреЛрдИ = () => {рд╡рд╛рдкрд╕реА axios.request(...)}

рдореИрдВ рдЕрдкрдиреЗ axios.d.ts рдореЗрдВ AxiosResponse рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддрд╛ рд╣реВрдВ:

import axios from 'axios'

declare module 'axios' {
  export interface AxiosResponse<T = any> extends Promise<T> {}
}

рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдЙрдЫрд╛рд▓ рд░рд╣реЗ рд╣реИрдВред рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ... рдареАрдХ рд╣реИ рдЬрдм рдореИрдВрдиреЗ рдЕрднреА-рдЕрднреА AxiosInstance рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рд╕реНрдерд╛рдиреАрдп рдЯрд╛рдЗрдкрд┐рдВрдЧ рдореЗрдВ рдХреЙрдкреА рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд▓рд╛рдЧреВ рд╕рдорд╛рдзрд╛рди рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдмрд╣реБрдд рдХреНрд░рд┐рдпрд╛рддреНрдордХ рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рдореИрдВ рдХреБрдЫ рдЧрд▓рдд рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ (рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдирд╣реАрдВ)ред рдЪреВрдВрдХрд┐ рдореИрдВ axios.create рдХреЗ рд╕рд╛рде рдмрдирд╛рдП рдЧрдП рдПрдХ рдЕрд▓рдЧ рдЕрдХреНрд╖реАрдп рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдЗрд╕ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ:

AxiosClient.interceptors.response.use(
  response => response && response.data,
  error => error && error.response && error.response.data
);

рдЬрд╣рд╛рдВ response.data рдореЗрдВ рд╣рдореЗрд╢рд╛ рдпрд╣ рдлреЙрд░реНрдо рд╣реЛрддрд╛ рд╣реИ:

export interface APIResponse<T = any> {
  data: T;
  message: string;
  status: boolean;
}

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдЗрд╕ рддрд░рд╣ AxiosClient.post рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ:

AxiosClient.post<EndpointAPIResponse, APIResponse<EndpointAPIResponse>>('/endpoint', { someData });

.then рдореЗрдВ рдЙрдЪрд┐рдд рдкреНрд░рдХрд╛рд░ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдПред рдХреНрдпрд╛ рдореИрдВ рдпрд╣рд╛рдБ рдХреБрдЫ рдЧрд▓рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдБ рдпрд╛ рдХреНрдпрд╛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд╣ рд╡рд░реНрдмреЛрдЬрд╝ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП? рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдпрд╣ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ рдпрджрд┐ рдореИрдВ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдмрдирд╛рддреЗ рд╕рдордп рдЕрдкреЗрдХреНрд╖рд┐рдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реНрдХреАрдорд╛ рдкрд╛рд╕ рдХрд░ рд╕рдХреВрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛:

export interface AxiosInstance<R> {
  <T = any>(config: AxiosRequestConfig): Promise<R<T>>;
  <T = any>(url: string, config?: AxiosRequestConfig): Promise<R<T>>;
  defaults: AxiosRequestConfig;
  interceptors: {
    request: AxiosInterceptorManager<AxiosRequestConfig>;
    response: AxiosInterceptorManager<R>;
  };
  getUri(config?: AxiosRequestConfig): string;
  request<T = any>(config: AxiosRequestConfig): Promise<R<T>>;
  get<T = any>(url: string, config?: AxiosRequestConfig): Promise<R<T>>;
  delete<T = any>(url: string, config?: AxiosRequestConfig): Promise<R<T>>;
  head<T = any>(url: string, config?: AxiosRequestConfig): Promise<R<T>>;
  post<T = any>(url: string, data?: any, config?: AxiosRequestConfig): Promise<R<T>>;
  put<T = any>(url: string, data?: any, config?: AxiosRequestConfig): Promise<R<T>>;
  patch<T = any>(url: string, data?: any, config?: AxiosRequestConfig): Promise<R<T>>;
}

export interface AxiosStatic extends AxiosInstance<AxiosResponse> {
  create<T = AxiosResponse>(config?: AxiosRequestConfig): AxiosInstance<T>;
  Cancel: CancelStatic;
  CancelToken: CancelTokenStatic;
  isCancel(value: any): boolean;
  all<T>(values: (T | Promise<T>)[]): Promise<T[]>;
  spread<T, R>(callback: (...args: T[]) => R): (array: T[]) => R;
}

рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд┐рдирд╛ axios.create() рдХреЗ рд╕рд╛рде рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдХреЗрд╡рд▓ axios , рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдореИрдВ рдЗрд╕ рддрд░рд╣ рдЕрдкрдирд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВ:

const AxiosClient = axios.create<APIResponse>({
  // ...
});

рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ: AxiosClient.post<string>('/endpoint').then(value => value.data) , value.data рдореЗрдВ рдЯрд╛рдЗрдк рд╣реИ... рдЯреАред рдкреНрд▓рд╕ рдЙрдкрд░реЛрдХреНрдд рд╕рдВрд╕реНрдХрд░рдг рдХреЗрд╡рд▓ рддрднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрдм рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрди рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЛ рдиреЛрдб_рдореЙрдбреНрдпреВрд▓реНрд╕ рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реВрдВ, рдЕрдиреНрдпрдерд╛ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдорд┐рд╢реНрд░рд┐рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдореИрдВ рдХреБрдЫ рдХреБрд▓ рдЖрдкрджрд╛ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрддред рдХреНрдпрд╛ рдХреЛрдИ рдЗрд╕рдореЗрдВ рдореЗрд░реА рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ?

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдареАрдХ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЬреЗрдирд░рд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ (рдЗрд╕рд▓рд┐рдП R<T> рдЬрдм рдЖрд░ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рд╣реИ рддреЛ рд╕рд╣реА рд╕рд┐рдВрдЯреИрдХреНрд╕ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реЗрдмрд╕реНрдЯреЙрд░реНрдо рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдирд╣реАрдВ рд╣реБрдЖ рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП); https://github.com/Microsoft/TypeScript/issues/1213 рдпрд╣, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рдЗрд╕реЗ рд╣рд▓ рдХрд░ рджреЗрдЧрд╛ рд▓реЗрдХрд┐рди рдХреЛрдИ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдХрднреА рд▓рд╛рдЧреВ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

const request = <T>(options: AxiosRequestConfig) => {
    return axios.request<IResponse<T>>(options).then<T>(response => {
        const data = response.data;
        if (data.c !== '0') {
            return Promise.reject(new Error(data.m || 'error'));
        }
        return data.d;
    });
}

рдЙрдкрдпреЛрдЧ:

request<IApiGetBrandGoodsInfoByIds>({
        method: 'GET',
        url: '/api/a/b',
    });

@zcei рдХреНрдпрд╛ рдпрд╣ рдЕрднреА рддрдХ рд╣рд▓ рд╣реЛ рдЧрдпрд╛ рд╣реИ? рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реВрдБ:

// so I created an axios instance:
const instance = axios.create(someOptions);

// then used interceptors
instance.interceptors.response.use((res) => res.data.data);   // server response will always have 'data'

// then when using the following to make a request
instance.get<string>(someURI);  // suppose server response was {data: 'some message'}

// ^^ the above returns type AxiosPromise<string>. How do I get it to return type Promise<string> instead?

рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ, рдореИрдВ рд╕рдВрд╕реНрдХрд░рдг 0.19рдмреАрдЯрд╛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реВрдВ, рдЯреАрдПрд╕ рднреА рд╕рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЛ рдкрд╛рд░реНрд╕ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ

рдореИрдВ рдЕрдкрдиреЗ axios.d.ts рдореЗрдВ AxiosResponse рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддрд╛ рд╣реВрдВ:

import axios from 'axios'

declare module 'axios' {
  export interface AxiosResponse<T = any> extends Promise<T> {}
}

рдУрд╣ рдирд┐рдпреБрдкреА

рдореИрдВ рдХреБрдЫ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ: response => response.data ред рддреЛ рдореБрдЭреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ AxiosResponse рд░реИрдкрд░ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред

рдореИрдВ рдЕрдВрдд рдореЗрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реВрдВ:

import axios from 'axios'

declare module 'axios' {
  export interface AxiosInstance {
    request<T = any> (config: AxiosRequestConfig): Promise<T>;
    get<T = any>(url: string, config?: AxiosRequestConfig): Promise<T>;
    delete<T = any>(url: string, config?: AxiosRequestConfig): Promise<T>;
    head<T = any>(url: string, config?: AxiosRequestConfig): Promise<T>;
    post<T = any>(url: string, data?: any, config?: AxiosRequestConfig): Promise<T>;
    put<T = any>(url: string, data?: any, config?: AxiosRequestConfig): Promise<T>;
    patch<T = any>(url: string, data?: any, config?: AxiosRequestConfig): Promise<T>;
  }
}

рдпрджрд┐ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реИ:

  1. рдХрд╣реАрдВ рдЯрд╛рдЗрдк рд▓рд┐рдЦреЗрдВ, рдЬреИрд╕реЗ src/types/axios/axios.d.ts ред
  2. рдЕрдкрдирд╛ tsconfig.json рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП
{
  "compilerOptions": {
    "typeRoots": [
        "./node_modules/@types",
        "./src/types/",
    ]
  }
}

рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

Api.boards.createBoard = jest.fn((name:string) => {
      const mockBoardResult = {
        created_on: mockBoardData.date,
        name,
        threads: [],
        updated_on: mockBoardData.date,
        _id: mockBoardData._id
      };
      return Promise.resolve({data:mockBoardResult}) as Promise<AxiosResponse<any>>
    });

рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХрд╛ рджреВрд╕рд░рд╛ рддрд░реАрдХрд╛

import * as axios from 'axios'

declare module 'axios' {
  interface AxiosInstance {
    (config: AxiosRequestConfig): Promise<any>
  }
}

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рд╣рдореЗрдВ рд╢рд╛рдпрдж AxiosResponse рдореЗрдВ рд╕рдВрдкрддреНрддрд┐ рдирд╣реАрдВ рдЬреЛрдбрд╝рдиреА рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдХреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

// @axios-exts/add-foo-to-resp
declare module 'axios' {
  interface AxiosResponse<T = any> {
    foo: string
  }
}
const addFooToResp = (res: AxiosResponse) => {
  res.foo = 'bar'
  return res
}
export default addFooToResp
// Your Project
import axios from 'axios'
import addFooToResp from '@axios-exts/add-foo-to-resp'

var id = axios.interceptors.response.use(addFooToResp)

axios.get('xx').then(res => {
  // have type defined
  // because we use `declare module 'axios'` ts can infer type
  console.log(res.foo)
})

// but if then eject?
axios.interceptors.response.eject(id)
axios.get('xx').then(res => {
  // also have type defined, it's maybe not reasonable
  console.log(res.foo)
})

рд╣рдо рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдХрд░рддреЗ рд╣реИрдВ? рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реЛрдЧреАред
рдЕрдЧрд░ рдХрд┐рд╕реА рджрд┐рди рд╣рдо рдХрд┐рд╕реА рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдЖрдзрд╛рд░ рдмрд░реНрддрди рд╕реЗ рд╣рдЯрд╛ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЙрд╕ рдХреЛрдб рдХреЛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдПрдХ рддреНрд░реБрдЯрд┐ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИред

рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ AxiosResponse рдореЗрдВ рдХреБрдЫ рд╕рдВрдкрддреНрддрд┐ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдЯрд╛рдЗрдк рдЕрдиреБрдорд╛рди рд╣реИ, рдпрд╣ рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕реА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдХреЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдкрд░ рдЯрд╛рдЗрдк рдЕрдиреБрдорд╛рди рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ axios рдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:
рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдХреЛ рдХреБрдЫ рдРрд╕рд╛ рд╕рдВрднрд╛рд▓рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕рдХрд╛ AxiosResponse рдкрд░ рдХреЛрдИ рдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рд╣реИ, рдпрджрд┐ рдЖрдк AxiosResponse рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдЯрд╛рдЗрдк рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ 'рдкреНрд▓рдЧрдЗрди' рдкрд╕рдВрдж рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП

// @axios-exts/add-foo-to-resp
declare module 'axios' {
  interface AxiosResponse<T = any> {
    foo: string
  }
}
const addFooToResp = (res: AxiosResponse) => {
  res.foo = 'bar'
  return res
}
export default (axios) => {
  axios.interceptors.response.use(addFooToResp)
}
// Your Project
import axios from 'axios'
import addFooToResp from '@axios-exts/add-foo-to-resp'

addFooToResp(axios)

рдпрд╣ 100% рд╕реБрд░рдХреНрд╖рд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХреЗрд╡рд▓ axios.interceptors.response.use . рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рд╕реБрд░рдХреНрд╖рд╛ рд╣реИ

рдФрд░ рдореИрдВ axios desgin рдХреЛ рдПрдХ рдкреНрд▓рдЧрдЗрди рд╕рд┐рд╕реНрдЯрдо рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ, рдЕрдм рд╣рдо рд╣рдореЗрд╢рд╛ рдРрд╕рд╛ рджреЗрдЦрддреЗ рд╣реИрдВ

import axios from 'axios'
import wrapper from 'axios-cache-plugin'

let http = wrapper(axios, {
  maxCacheSize: 15
})
export default http

рдПрдХ рдкреНрд▓рдЧрдЗрди рдХреЛ axios рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП wrapper рдХреА рддрд░рд╣ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рдкреНрд▓рдЧрдЗрди рдХрд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдирд┐рдпрдо рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдкрд╕рдВрдж рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП

import axios from 'axios'
import axiosCache from 'axios-cache-plugin'

axios.use(axiosCache, {
  // some options
})
export axios
// axios-cache-plugin
export default (axios) => {}
// or
export default {
  install(axios){}
}
// like Vue.use for Vue.js

axios.request<T>(...args) рд╢реИрд▓реА рдкрд░рд┐рднрд╛рд╖рд╛ рдХрд╛ рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВред
рд╕рд░рдгреА рдореЗрдВ рдЕрдВрддрд┐рдо рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдкрд░реЛрдХреНрд╖ рд░реВрдк рд╕реЗ (currentResponse: any) => T рдЬреИрд╕реЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЕрдиреБрдкрд╛рд▓рди рдХрд░рддрд╛ рд╣реИ

рддреЛ рдЕрдЧрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ data рдХреБрдЫ рдРрд╕рд╛ рд╣реИ:

interface ServerResponse {
  data: ServerData
}

interface ServerData {
  foo: string
  bar: number
}

рддрдм рдЖрдк рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ:

axios.request<ServerData>({
  url: 'https://example.com/path/to/data',
  transformResponse: (r: ServerResponse) => r.data
}).then((response) => {
  // `response` is of type `AxiosResponse<ServerData>`
  const { data } = response
  // `data` is of type ServerData, correctly inferred
})

Pls рдХреНрдпрд╛ рдЖрдк рдореБрдЭреЗ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдореИрдВ tsx . рдХреЗ рд╕рд╛рде Axios рдЕрдиреБрд░реЛрдз рдореЗрдВ рд╢реАрд░реНрд╖рд▓реЗрдЦ рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреИрд╕реЗ рдЬреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реВрдВ

@MoZiadAlhafez

declare module 'axios' {
  interface AxiosRequestConfig {
    useCache: boolean
  }
}

рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдиреБрд╢рдВрд╕рд┐рдд рдирд╣реАрдВ рд╣реИ

рдпрд╣ рдПрдХ рд▓рдВрдмреА рдХрд╣рд╛рдиреА рд╣реИ, рд▓реЗрдХрд┐рди рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ #1605 рдореЗрдВ рд╕реБрд▓рдЭрд╛ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рджреЗрдЦреЗрдВ https://github.com/axios/axios/issues/1510#issuecomment -396894600ред

рдЕрдЧрд░ рдореИрдВрдиреЗ рдХреБрдЫ рдЧрд▓рдд рд╕рдордЭрд╛ рд╣реИ, рддреЛ рдпрд╣рд╛рдВ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдПрдХ рдирдпрд╛ рдореБрджреНрджрд╛ рдЦреЛрд▓рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред рдзрдиреНрдпрд╡рд╛рджред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

9tor picture 9tor  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

samayo picture samayo  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

c0debreaker picture c0debreaker  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Spartano picture Spartano  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

ildella picture ildella  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ