TypeScriptïŒTSïŒã«ç§»è¡ãããããžã§ã¯ãã§ã¯ãå¿çã€ã³ã¿ãŒã»ãã¿ãŒr => r.data
ããããŸãã AxiosResponse
ã®ã¿ã€ããæåŸ
ããŠããªãããšãTSã«éç¥ããã«ã¯ã©ãããã°ããã§ããïŒ as Array<...
ã䜿çšããŠãªãŒããŒã©ã€ãããããšããŸãããã AxiosResponse
ãArray
ãšããŠãã£ã¹ãã§ããªããããæ©èœããŸããïŒããšãã°ã.lengthããããŸããïŒã
ããããšãïŒ
axios.request<T>(...args)
ã¹ã¿ã€ã«å®çŸ©ã䜿çšããŸãã
é
åå
ã®æåŸã®Response-interceptorã¯ã (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 oohå®éãããã¯ã°ããŒãã«ã€ã³ã¿ãŒã»ãã¿ãŒã§ã¯æ©èœããŸãããäŸïŒ axios.interceptors.response.use
ç§ã¯ããæããŸã-ã€ã³ã¿ãŒã»ãã¿ãŒã¯çŸåšéåžžã«ããªã©ãã¯ã¹ãããã¿ã€ãïŒå¥åany
ïŒãªã®ã§ãå¿çã€ã³ã¿ãŒã»ãã¿ãŒãæ¥ç¶ããŠ(r: any): any => r.data
ã«ããããšãã§ããŸãïŒããã¯åºæ¬çã«ã¯éå³å¯ã¢ãŒãã§ã®å
¥åã¯çç¥ããŠãã ããïŒã
axios.request
ãåŒã³åºããæç¹ã§ã®ã¿ããžã§ããªãã¯ãæ§æã§ããŸãããžã§ããªãã¯ã¯ã data
ããããã£ã®ã¿ã€ããšããŠæž¡ãããŸãã
ïŒå®éãäžèšã®ã³ãŒãã¹ãããããééããŸããã data
ã¯å®éã«ã¯AxiosResponse<ServerData>
ã§ãããã¿ã€ãServerData
ã®.data
ãšãããã£ãŒã«ãããããŸã-æŽæ°ããŸããïŒ
@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.foo
ãä»ããŠã¢ã¯ã»ã¹ã§ããŸãã
ãã ãã response.foo
ãžã®ã¢ã¯ã»ã¹ã¯æ©èœããŸãããããã¯ãå¿çã³ãŒããªã©ã®ä»ã®ãã®ã远跡ãããã«ãŒããå¿çã¬ãã«ã§ããããã§ãã
ç³ãèš³ãããŸããããå°ãªããšãæ©èœé¢ã§ã¯ãããªãã®åæã«åæããŸããã
ã€ã³ã¿ãŒã»ãã¿ãŒã䜿çšããŠããŒã¿ããããã£ãã¢ã³ã©ããããªããšã
this.instance.post<string>(...).then(response => response.data);
this.instance.get<number>(...).then(response => response.data);
ç§ãå®çŸ©ãã_every_ãšã³ããã€ã³ãã§ã ãã®ãã¹ãŠã®ã³ãŒãã®ç¹°ãè¿ãã®ãã€ã³ãã¯äœã§ããïŒ
ãªã¯ãšã¹ããæåãããã³ã«ãã€ãŸãthen
ãããå Žåã¯ãå¿çã³ãŒããªã©ã¯ããŸãæ°ã«ããŸãããäœããæ©èœããªãã£ãå Žåã«ã®ã¿å¿çã³ãŒããæ°ã«ããŸããããããšã©ãŒãã³ãã©ãŒã®ç®çã§ãã ãã€ã³ã¿ãŒã»ãã¿ãŒãšç¹å®ã®ãšã³ããã€ã³ãã®äž¡æ¹ã§ã
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 => { ... });
誰ãã1ã€ã®ãããžã§ã¯ãã§ç§ãšåãããã«ç©äºãè¡ãã¹ãã ãšããèããã©ãã§åŸãã®ãããããŸããã ç§ã¯åã«ããªã¯ãšã¹ãããšã«ããŒã¿ãèªåçã«ã¢ã³ã©ããããæ¹æ³ã®åé¡ã解決ããããšããŠããŸãããã®åé¡ãç§ã®åã«ãã£ãããšãèãããšããã®åé¡ãæ±ããŠããã®ã¯ç§ã ãã§ã¯ãããŸããã
ã€ã³ã¿ãŒã»ãã¿ãŒã¯ãååãšreadmeã§ã®èª¬æã®äž¡æ¹ã§ããããè¡ãããã®æ£ããå Žæã奜ãã§ãïŒãã¹ãŠã®å¿çã§äœããè¡ããŸãïŒã 204
ãš200
ãªã©ãåŠçããŠããããŒã¿ãæž¡ãããšããã€ã³ã¿ãŒã»ãã¿ãŒã§æå³ããããŸããããã¯ã1ã€ã®äžå€®ã®å Žæã§è¡ãããšãã§ããããã§ãã
ç§ã®æèŠã§ã¯ãçŽæçãªè§£æ±ºçã¯ãã©ã€ãã©ãªã«äžæ¹åã«åŒ·å¶ãããã®ã§ã¯ãªããã€ã³ã¿ãŒã»ãã¿ãŒããå¿ èŠãªãã®ãè¿ãããšã§ãã
ããŒã¿ã®äžéšã®ãã£ãŒã«ããå€æããå ŽåïŒ
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
ã«ãªãå¿
èŠããããŸããç§ã¯æšæž¬ããéçºè
ãæ£ããããšãè¡ãããã«åªåããŸãã
ããã¯ãå°ãªããšã1ã€ã®ããããã£ã«ã¢ã¯ã»ã¹ããããããã¿ã€ããç·©åãããŠããããã«ãšã©ãŒãçºçããããããã«æããŸãã
ã80ïŒ ã®ãŠãŒã¹ã±ãŒã¹ãã®åå®å šæ§ãç¶æããªãããã€ã³ã¿ãŒã»ãã¿ãŒãã«ãŒãå¿çãäžæžãã§ããPRãèãåºãããšãã§ããã°ãç§ã¯ãšãŠã幞ãã§ãã
åé¡ã¯ãç§ãäœæããäžèšã®äŸã¯äž¡æ¹ãšããç§ã説æããããã«ãæ©èœçã«ã¯ãã§ã«æ©èœããŠãããšããããšã§ããééã£ãŠããã®ã¯ã¿ã€ãã ãã§ãã ã€ã³ã¿ãŒã»ãã¿ãŒã§ïŒå€æŽãããïŒå¿ç以å€ã®ãã®ãè¿ãããšãééã£ãŠããå Žåã¯ãããã§æåŸ ãããã¿ã€ããæŽæ°ããã®ãè¯ããšæããŸãã
ãŸãã @ Etheryteã§åãããšãããŠããããšãç¥ãã®ã¯èå³æ·±ãããšã§ãã
ç§ãã¡ã®ã¢ããªã§ã¯ã r => r.data
ããã§ãŒã³ã®æçµå¿çã€ã³ã¿ãŒã»ãã¿ãŒã§ãããæŽæ°ããŒã¯ã³ãªã©ãåŠçããããã«ã¹ããŒã¿ã¹ã³ãŒãã«äŸåããä»ã®ãã®ã䜿çšããŸãããç¹å®ã®ç®çã§ãããåŠçããå¿
èŠããªããããã°ããŒãã«ã¬ãã«ã§äœ¿çšããŸãåŒã³åºããŸãã
TSã§ã¯ãã®ãŠãŒã¹ã±ãŒã¹ã«å¯Ÿå¿ã§ããªãå¯èœæ§ãããããšãç解ããŠããŸãã ãã ãã @ zceiã¯ãAxios APIïŒã€ã³ã¿ãŒã»ãã¿ãŒïŒã®å ¬åŒéšåã䜿çšããŠããããããããAxiosã䜿çšããããã®æ£åœãªæ¹æ³ã§ããããšã¯åŠå®ã§ããŸãã:)ã
ããŒïŒ ç§ã¯ãã€ãééã£ãã³ãŒããèŠãŠããŸããð€ŠââïžãããŠã€ã³ã¿ãŒã»ãã¿ãŒã§ã¯ãªã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)
})
ããŒã«ã«ã§è©ŠããŠã¿ããšãããæ¢ããŠããããšãå®è¡ããŠããããã§ãã
ãã¶ãç§ã¯å€æ¹ã«äžç·ã«PRãååŸããŠããã¹ãŠã®ã¡ãœããã®PRãæŽæ°ããããšãã§ããŸãã
@zceiããããã ïŒ ãã¡ãããããã©ã«ãã§AxiosResponseã䜿çšããããšã¯ã99ïŒ ã®ç¢ºçã§çã«ããªã£ãŠããŸãð
èããŠããã£ãïŒ æ··ä¹±ããŠãã¿ãŸããð
@zceiã¯åé¡ãããŸããïŒ èå³æ·±ãããšã«ãAxiosã®ãªãªãŒã¹ãµã€ã¯ã«ã¯äœã§ããïŒ
äœããããŸãã-v1alphaïŒïŒ1333ïŒã«ã€ããŠã¯ãŸã ä¿çäžã®ãã®ãããã€ãããããã®éã @ nickuraltsev / @ emilyemorehouseã¯å¿
èŠã«å¿ããŠãªãªãŒã¹ãè¡ã£ãŠããŸãã
v0.18
以éãããçšåºŠã®çœåŒåãããïŒç§ã®ãæ°ã«å
¥ãïŒã€ã³ã¹ã¿ã³ã¹ãžã®ã¹ã³ãŒããªãã·ã§ã³ãå«ãïŒããªãªãŒã¹ãåæžã§ãããšæããŸãã 詳现ã«ã€ããŠã¯ã Gitterã«ãæåŸ
ããŸãã®ã§ãåé¡ãé©åã«ä¿ã€ããšãã§ããŸãð
0.19ãªãªãŒã¹ãåºãããšãæãã§ããŸããããæåŸã«ç¢ºèªãããšããããã¹ã¿ãŒã¯CIã«å€±æããŠããŸããã 1.0ããªãªãŒã¹ããããããã確å®ã§å®æçãªãªãªãŒã¹ã¹ã±ãžã¥ãŒã«ã確å®ã«æãã§ããŸãã
åãåé¡ã«å¯Ÿå¿ããŸãã 解決çã¯ãããŸããïŒ
@qidaneixã¯ããªãªãŒã¹ãè¡ããããŸã§npm install axios/axios#master
ãã€ã³ã¹ããŒã«ããŠã¿ãããšãã§ããŸãã ïŒ1605ã¯ãããä¿®æ£ããå¿
èŠããããŸããã ãã¹ãã ãã§ãªããå®éã®ãŠãŒã¹ã±ãŒã¹ã«æ¬åœã«åœ¹ç«ã€ãã©ããããã£ãŒãããã¯ãããã ããã°å¹žãã§ãð
@zceiææ¥ãã£ãŠã¿ãŸã
@zceiãã€ãªãªãŒã¹ãããã®ãèããŠãããã§ããïŒ
1.0.0ããªãªãŒã¹ããããšãã«+1ïŒ
ããã¯ç¢ºãã«1.0ããåã®ãªãªãŒã¹ã«ãªããŸãã @KhaledgarbayaãMattã«ãã£ãŠNPMã«è¿œå ãããŸãããïŒ ãã以å€ã®å Žåã¯ãããããªãªãŒã¹ããæ®ãã®ã¡ã³ããã«èŠªåã«ããå¿ èŠããããŸãð
ããã¿ããªã ç§ã¯çŸåšãNPMãªãªãŒã¹ã管çããŠããŸãã 1.0.0ããåã®å¥ã®ãªãªãŒã¹ãçºè¡ãããã®ã§ãããTravisãã¹ãã倱æãããŸã ä¿®æ£ããæ©äŒããããŸããã ããããä¿®æ£ãããããç§ã¯ãããããã«åºãããšãã§ããŠãšãŠã幞ãã§ãð¬
@zcei npmãªããžããªã«è¿œå ãããŸããã§ãããå€æŽãããŒãžããããšããã§ããŸãã
ãã®åé¡ã«é¢ããæŽæ°ã¯ãããŸããïŒ2ãæç®ãªã©ãè¿ãå°æ¥ã«ãªãªãŒã¹ãããäºå®ã§ããïŒ
+1
â€ïžãããä»ãªãªãŒã¹ãããå¯èœæ§ãããå Žå
èªèããŠããŸãããçŸåšãããã¯ãããŠããŸãã ðããã§è©³çŽ°æ å ±ãå ¥æã§ããŸãïŒ https ïŒ//github.com/axios/axios/issues/1657#issuecomment -410766031
0.19.0-beta.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) })
ããŒã«ã«ã§è©ŠããŠã¿ããšãããæ¢ããŠããããšãå®è¡ããŠããããã§ãã
ãã¶ãç§ã¯å€æ¹ã«äžç·ã«PRãååŸããŠããã¹ãŠã®ã¡ãœããã®PRãæŽæ°ããããšãã§ããŸãã
UserïŒTãæåã®æ±çšãã©ã¡ãŒã¿ãŒïŒã¯äœ¿çšãããŠããªãããã§ããã«ã¹ã¿ã ã®æ»ãå€ã䜿çšãããå Žåã¯ãå¥åŠã«èŠããŸãð
axios.request<void, string>({
...
})
voidã䜿çšãããšãããæ確ã«ãªãå ŽåããããŸãã
@emilyemorehouseæ©ç¥ããã§ã¯ãããŸãããã0.19ããŒã¿çã3ãæéãªãŒãã³ããŠããŸãããGAãªãªãŒã¹ã®ETAã¯ãããŸããïŒ ç§ãã¡ã®ãããžã§ã¯ãã«ã¯ããããã®ä¿®æ£ã®1ã€ãå¿ èŠãšããåé¡ããããŸãã ç§ã¯Gitterãã£ã³ãã«ã§ãããå°ããŸããããã¡ã³ãããåããã§å¿çããŠããããã«ã¯èŠããŸãã...
ãããããããè¯ãèšãåãã¯ããªãªãŒã¹åã«è§£æ±ºããå¿ èŠã®ããåé¡ã¯äœã§ãããããã远跡ããå Žæã¯ãããŸããïŒ å€ãã®é¢å¿ãããããã«æãããã®ã§ãäœæ¥ãåºããå¿ èŠãªäœæ¥ãæ確ã«ç解ããããšã¯ãç©äºãã¹ããŒãã¢ããããã®ã«åœ¹ç«ã€å¯èœæ§ããããŸãã
0.19ã®ãããžã§ã¯ããã€ã«ã¹ããŒã³ã¯ãã§ã«ãããŸããããªã¹ããããŠãããã±ããã¯æ°ãæéå€æŽãããŠããŸããã
const func1ïŒany =ïŒïŒ=> {return axios.requestïŒ...ïŒ}
axios.d.ts
ã®AxiosResponse
ããªãŒããŒã©ã€ãããŸãïŒ
import axios from 'axios'
declare module 'axios' {
export interface AxiosResponse<T = any> extends Promise<T> {}
}
ãã®åé¡ãã¶ã€ããŸãã ããã¯æ©èœããŸã... AxiosInstanceå®çŸ©ãããŒã«ã«ã¿ã€ãã³ã°ã«ã³ããŒããã ãã§åé¡ãããŸããããïŒTypescriptã®å°é家ã§ã¯ãªãïŒäœãééã£ãããšãããŠããªãéããå®è£
ããããœãªã¥ãŒã·ã§ã³ã¯ç§ã®æèŠã§ã¯éåžžã«åé·ã§ãã axios.create
ã§äœæãããå¥ã®axiosã€ã³ã¹ã¿ã³ã¹ã䜿çšããŠããããã®ã€ã³ã¿ãŒã»ãã¿ãŒã䜿çšããŠããããã次ã®ããã«ãªããŸãã
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
ã«ã¯ã¿ã€ãããããŸã...Tãããã«ãäžèšã®ããŒãžã§ã³ã¯ãnode_modulesã§ãããã®ã¿ã€ããå®éã«çœ®ãæããå Žåã«ã®ã¿æ©èœããŸããããããªããšãå®å
šã«æ··åãããŠããŸããŸããããã€ãã®å®å
šãªçœå®³ã«çµãããŸãã 誰ããããã§ç§ãå©ããããšãã§ããŸããïŒ
ç·šéïŒããããŸããããžã§ããªãã¯ããã®ããã«äœ¿çšããããšã¯ã§ããªããããæ©èœããªããšæããŸãïŒãããã£ãŠãRããžã§ããªãã¯åã®å Žåã®R<T>
ã¯æ£ããæ§æã§ã¯ãããŸããããäœããã®çç±ã§WebStormã匷調衚瀺ãããªãã£ããšæããŸãç§ã«ãšã£ãŠã¯ïŒ; 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.19betaãã€ã³ã¹ããŒã«ããŸãããŸããtsã¯æ£ããã¿ã€ãã解æã§ããŸãã
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)
})
ãªãtypescriptã䜿ãã®ã§ããïŒ ç§ãã¡ã®ãããžã§ã¯ããå®å
šã«è¡ãããããšãé¡ã£ãŠããŸãã
ãã€ãããŒã¹utilsããããããã£ãåé€ããå Žåããããåç
§ããã³ãŒããã³ã³ãã€ã«æã«ãšã©ãŒãçæããããã«ããŸãã
ãããã£ãŠãã€ã³ã¿ãŒã»ãã¿ãŒã䜿çšããŠ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
ã䜿çšãããããå®å
šã§ãã
ãããŠç§ã¯axiosdesginãã©ã°ã€ã³ã·ã¹ãã ããå§ãããŸããä»ç§ãã¡ã¯ãã€ã次ã®ããã«èŠããŸã
import axios from 'axios'
import wrapper from 'axios-cache-plugin'
let http = wrapper(axios, {
maxCacheSize: 15
})
export default http
wrapper
ã®ããã«äœ¿çšããŠããã©ã°ã€ã³ãaxiosã«æ¥ç¶ããŸãããã¹ãŠã®ãã©ã°ã€ã³ã«å
±éã®ã«ãŒã«ã¯ãªããååã«ãšã¬ã¬ã³ãã§ã¯ãããŸããã ç§ã¯å¥œããªã¯ãã ãšæããŸã
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)
ã¹ã¿ã€ã«å®çŸ©ã䜿çšããŸãã
é åå ã®æåŸã®Response-interceptorã¯ã(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
ããªãŒããŒã©ã€ãããŸãïŒ