рдПрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдореИрдВ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ (рдЯреАрдПрд╕) рдореЗрдВ рдорд╛рдЗрдЧреНрд░реЗрдЯ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рд╣реИ r => r.data
ред рдореИрдВ TS рдХреЛ рдХреИрд╕реЗ рд╕реВрдЪрд┐рдд рдХрд░реВрдБ рдХрд┐ рдореИрдВ AxiosResponse
рдкреНрд░рдХрд╛рд░ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ? рдореИрдВрдиреЗ as Array<...
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ AxiosResponse
рдХреЛ Array
рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рдбрд╛рд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд▓рдВрдмрд╛рдИ рдирд╣реАрдВ рд╣реИ)ред
рдзрдиреНрдпрд╡рд╛рдж!
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>
рд╣реИ, рдЬреЛ рдбреЗрдЯрд╛ рдХреЛ рд▓рдкреЗрдЯреЗ рдЬрд╛рдиреЗ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИред
рдпрд╣ рдЬрд╛рдирдмреВрдЭрдХрд░ рд╣реИред рдЖрдкрдХреЛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рдмрджрд▓рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреБрдВрдЬреА рдХреЛ рдлрд╣рд░рд╛рдирд╛ рдирд╣реАрдВ рд╣реИред
рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рд╕рд░реНрд╡рд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╣реЛрдЧреА рдЬреИрд╕реЗ
{
"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>;
}
}
рдпрджрд┐ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реИ:
{
"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ред
рдЕрдЧрд░ рдореИрдВрдиреЗ рдХреБрдЫ рдЧрд▓рдд рд╕рдордЭрд╛ рд╣реИ, рддреЛ рдпрд╣рд╛рдВ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдПрдХ рдирдпрд╛ рдореБрджреНрджрд╛ рдЦреЛрд▓рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред рдзрдиреНрдпрд╡рд╛рджред
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдореИрдВ рдЕрдкрдиреЗ
axios.d.ts
рдореЗрдВAxiosResponse
рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддрд╛ рд╣реВрдВ: