当前位置: 首页 > 知识库问答 >
问题:

javascript - axios响应数据类型怎么定义?

巴洲
2023-09-20

axios响应数据类型怎么定义?

相关代码

type TResponse = ? // 应该怎么定义service.interceptors.response.use((response : TResponse) => {        const res = response.data // 这个结构是固定的 {code:number;msg:string;data:T}        if (res.code !== 0) {            return Promise.reject(new Error(res.message || "Error"))        } else {            return res        }    },    (error) => {        return Promise.reject(error)    })//                         这里code会报错 TS2339: Property  code  does not exist on type  AxiosResponse<any, any>  getTableData(fileData).then(({ code, data }) => {                if (code !== 0) return  })

共有2个答案

查锦程
2023-09-20
type ResponseData<T> = {code:number;msg:string;data:T}import { AxiosResponse } from 'axios';service.interceptors.response.use(<T>(response:AxiosResponse<ResponseData<T>>) => {        const res = response.data // 这个结构是固定的 {code:number;msg:string;data:T}        if (res.code !== 0) {            return Promise.reject(new Error(res.message || "Error"))        } else {            return res        }    },    (error) => {        return Promise.reject(error)    }) getTableData(fileData).then(({ code, data }) => {                if (code !== 0) return  })

以下是我自己毛遂自荐个人封装的axios的一个写法,可以提供给你参考一下:

api.ts:

export const HOST = process.env.NODE_ENV;export let BASE_URL = '';switch (HOST) {    case 'development'://开发环境地址        BASE_URL = '';        break;    default://生产环境接口地址        BASE_URL = '';}

axios.ts:

import axios, { AxiosResponse, InternalAxiosRequestConfig } from 'axios';// 此处message也可以换成element ui或者element plus等其它组件库的message// 或者也可以使用我写的轻量消息提示插件ewMessage:https://eveningwater.github.io/ew-message/import { message as $message } from 'antd';import { BASE_URL } from './api';const instance = axios.create({    baseURL: BASE_URL,    timeout: 6000});instance.interceptors.request.use(    <T>(        config:            | InternalAxiosRequestConfig<T>            | Promise<InternalAxiosRequestConfig<T>>    ) => {        // let token=localStorage.getItem('token');        // token && (config.headers.Authorization=token);//请求携带token        // config.headers = {        //     'Content-Type': 'application/x-www-form-urlencoded'  //转换数据格式        // }        return config;    },    <T>(error: T) => Promise.reject(error));instance.interceptors.response.use(    <T>(response: AxiosResponse<T>) => {        return response;    },    (error: { response: { status: number } }) => {        const { response } = error;        if (response) {            //服务器有返回内容            let errorMsg = '';            switch (response.status) {                case 400:                    errorMsg = '错误请求';                    break;                case 401:                    errorMsg = '未登录,请重新登录';                    break;                case 403:                    errorMsg = '决绝访问';                    break;                case 404:                    errorMsg = '请求错误,未找到该资源';                    break;                case 405:                    errorMsg = '请求方法未允许';                    break;                case 408:                    errorMsg = '请求超时';                    break;                case 500:                    errorMsg = '服务器出错';                    break;                case 501:                    errorMsg = '网络未实现';                    break;                case 502:                    errorMsg = '网络错误';                    break;                case 503:                    errorMsg = '服务不可用';                    break;                case 504:                    errorMsg = '网络超时';                    break;                case 505:                    errorMsg = 'http版本不支持该请求';                    break;                default:                    errorMsg = '连接错误';            }            $message.open({ type: 'warning', content: errorMsg });            return false;        } else {            //服务器连结果都没有返回  有可能是断网或者服务器奔溃            if (!window.navigator.onLine) {                //断网处理                $message.open({ content: '网络中断' });                return;            } else {                //服务器奔了                $message.open({ content: '服务器崩溃了' });                return Promise.reject(error);            }        }    });export function get<T>(url: string, params?: Record<string, unknown>): Promise<T> {    return new Promise((resolve, reject) => {        instance            .get(url, { params: params })            .then(res => resolve(res.data))            .catch(err => reject(err.data));    });}export function post<T>(url: string, params?: Record<string, unknown>): Promise<T> {    return new Promise((resolve, reject) => {        instance            .post(url, params)            .then(res => resolve(res.data))            .catch(err => reject(err.data));    });}export function patch<T>(url: string, params?: Record<string, unknown>):Promise<T> {    return new Promise((resolve, reject) => {        instance.patch(url, params).then(            res => resolve(res.data),            err => reject(err)        );    });}export function put<T>(url: string, params?: Record<string, unknown>):Promise<T> {    return new Promise((resolve, reject) => {        instance.put(url, params).then(            res => resolve(res.data),            err => reject(err)        );    });}export default {    get,    post,    patch,    put};

比如有一个接口为addResource.ts:

import { post } from './axios'// 这里的CommonRes则是你那边定义的 {code:number;msg:string;data:T}// 参数类型T具体自己定义export const addResource = <T>(params: T): Promise<CommonRes> => post('xxxx.xxx', { ...params });
巢烨
2023-09-20
interface Response extends AxiosResponse {    "字段": 类型}async (...) => {    const response: Response = await axios.post(...);}
 类似资料:
  • 我试图从API中呈现一个简单的用户列表,该列表返回以下内容: 我不完全理解如何使用类型处理Axios响应。TypeScript错误为 类型“{}|{id:number;firstName:string;}”不可分配给类型“IntrinsicAttributes” 属性“项目”在“{}”类型中缺失,但在“UserListProps”类型中是必需的。 从

  • 多个axios请求怎么按顺序实现?我写的是哪里出问题了,打印的res值都是来自第一个post请求的返回结果,第二个get请求里的res值没有获取到? 把第二个then放里面也是一样, 前端新手,请多指教

  • vue3 v-for 官方教程 如上图,今天在项目中遇到一个场景需要遍历渲染一个 Map 类型的数据,但是在我 v-for 的时候,发现了结果不是我预期的那种,但是官网也没有明确举例子。 如下图,我期望它能像数组一样,v-for 的时候就呈现出每一项的对应的 key -value 但是页面上却是这样的效果,只有一项,并且这一项竟然还是一个数组的样子(带方括号) 问题1:vue3 的 Map 该如何

  • 下面这个贴图中的告警怎么去除呢,需要怎么修改呢? 代码如下: 问题补充: 实例化后为其赋值时 ts警告:类型实例化过深,且可能无限 PbfLayer这个类中的完整代码如下:

  • 问题内容: 我似乎找不到有关Redis命令的有用信息。我想知道给定键值的数据类型。例如,要列出数据库的所有键,我运行以下命令: 在我的设置中,得到以下结果: 我如何知道密钥包含的数据类型?我尝试运行,但出现错误 有什么想法吗? 问题答案: 您可以使用type命令:http : //redis.io/commands/type

  • 主要内容:1. JS 基本数据类型,2. JS 引用数据类型数据类型指的是可以在程序中存储和操作的值的类型,每种编程语言都有其支持的数据类型,不同的数据类型用来存储不同的数据,例如文本、数值、图像等。 JavaScript 是一种动态类型的语言,在定义变量时不需要提前指定变量的类型,变量的类型是在程序运行过程中由 JavaScript 引擎动态决定的,另外,您可以使用同一个变量来存储不同类型的数据,例如: JavaScript 中的数据类型可以分为两种类型