老师的代码是这么写的:
function getUser<T=any>(){
return axios<ResponseData<T>>('/extend/user').then(res=>res.data).catch(err=>console.error(err))
}
此时把鼠标放在res上,发现res可以被显示为AxiosResponse<ResponseData<T>>
,我想了一下,因该是下面的代码起的作用
export interface AxiosInstance extends Axios {
<T=any>(config: AxiosRequestConfig): AxiosPromise<T>
<T=any>(url: string, config?: AxiosRequestConfig): AxiosPromise<T>
}
但是此时把鼠标放在err上,却发现err是any类型。我不明白的是,为什么这里只写了AxiosPromise,却没有写reject时情况,我尝试着改成下面的写法
export interface AxiosInstance extends Axios {
<T=any>(config: AxiosRequestConfig): AxiosPromise<T> | IAxiosError
<T=any>(url: string, config?: AxiosRequestConfig): AxiosPromise<T> | IAxiosError
}
但是这样又会报错,因为联合类型只能调用两个类型共有的方法,所以下面的代码会报错
// property then doesn't exist on tyepe IAxiosError
function getUser<T=any>(){
return axios<ResponseData<T>>('/extend/user').then(res=>res.data).catch(err=>console.error(err))
}
再回想一下我们以前定义的AxiosError类是怎么使用的
axios({
method: 'get',
url: '/error/timeout',
timeout: 2000
}).then((res) => {
console.log(res)
}).catch((e:IAxiosError) => {
console.log(e.message)
console.log(e.config)
console.log(e.code)
console.log(e.request)
console.log(e.isAxiosError)
})
居然是手动指定e是IAxiosError类的。
又什么办法可以统一下吗?