axios的返回值类型问题?
一般的axios的返回值类型
export interface AxiosResponse<T = any, D = any> { data: T;
status: number;
statusText: string;
headers: AxiosResponseHeaders;
config: AxiosRequestConfig<D>;
request?: any;
}
但是我在拦截器中做了处理,只返回接口的data
axios.interceptors.response.use( (response) => {
return response.data;
},
(error) => {
return Promise.reject(error);
}
);
然后实际使用的时候,提示我类型不对
promise.then((res: ResponseData)=>{})
提示我
类型“(res: ResponseData) => void”的参数不能赋给类型“(value: AxiosResponse<any, any>) => void | PromiseLike<void>”的参数。 参数“res”和“value” 的类型不兼容
应该怎么解决?
回答:
换成axios.request<any, ResponseData>() 方式看看,可以通过传入泛型,修改返回类型AxiosResponse
从axios的ts类型定义文件可以看出来,
export interface AxiosInstance { (config: AxiosRequestConfig): AxiosPromise;
(url: string, config?: AxiosRequestConfig): AxiosPromise;
defaults: AxiosRequestConfig;
interceptors: {
request: AxiosInterceptorManager<AxiosRequestConfig>;
response: AxiosInterceptorManager<AxiosResponse>;
};
getUri(config?: AxiosRequestConfig): string;
request<T = any, R = AxiosResponse<T>> (config: AxiosRequestConfig): Promise<R>;
如果直接用axios(config).then()的方式,axios()执行后返回AxiosPromise
而AxiosPromise的定义看
export interface AxiosPromise<T = any> extends Promise<AxiosResponse<T>> {}
并没有提供泛型,来修改返回值类型AxiosResponse,所以这种方式走不通,
如果用axios.request(config)方式,则可以利用
request<T = any, R = AxiosResponse<T>> (config: AxiosRequestConfig): Promise<R>;
axios.request<any, ResponseData>()泛型,修改返回值类型AxiosResponse<T>
回答:
封装一个fetch函数,把返回值类型当成泛型传入
async function fetch<T> (): T { const data = await axios()
return data
}
这样你返回的类型就是你传入的泛型了
回答:
axios.get 的类型定义
get<T = any, R = AxiosResponse<T>>(url: string, config?: AxiosRequestConfig): Promise<R>;
在使用 axios.get 时,把 ResponseData 作为泛型传进去就行啦
axios .get<any, ResponseData>(url)
.then(res => {
// res 的类型是 ResponseData
...
})
.catch(...)
以上是 axios的返回值类型问题? 的全部内容, 来源链接: utcz.com/p/932878.html