ts+axios 定义接口返回值的类型

该博客介绍了如何在TypeScript中利用Axios进行HTTP请求,并通过Promise定义自定义类型来匹配接口返回的数据结构。具体示例展示了如何为GET请求创建公用函数,以及如何为特定接口`GetData`定义响应类型`Response<Value>`,确保类型安全。内容涵盖了错误处理、接口参数和数据结构的详细说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目场景:

我尝试去定义 Promise<自定义>里的自定义的类型,希望与数据接口返回的类型一致目的是希望类型定义好之后可以不用去看文档也能知道这个接口返回的是哪些数据


描述

Axios 是一个基于 promise 的 HTTP 库:
需要使用Promise< 自定义>

公用get请求

/**
 * 公用get请求
 * @param url       接口地址
 * @param msg       接口异常提示
 * @param headers   接口所需header配置
 */
export const get = ({ url, msg = '接口异常', config }: IFRequestParam) => {
  axios.defaults.headers.common['Authorization'] = umbrella.getLocalStorage('user_token');
  return axios
    .get(url, config)
    .then((res) => {
      return res.data;
    })
    .catch((err) => {
      if (err.response && err.response.data.statusCode === '401) {
        // message.warn('请先登录');
        window.location.href = '/';
      } else if (!err.response || !err.response.data) {
        message.error(`API Server ${err.toString()}`);
        return;
      }
      if (err.response.status !== 200) {
        message.error(err.response.data.message || msg);
        return err.response.data;
      }
      message.error(err.response.data.message || msg);
    });
};

接口实例:

接口:http://10.0.1.1/GetData

参数:

参数类型
statusCodenumber
messagestring
valueArray< >
//类型
type ID = string;

interface ResponseOriginal<T> {
  statusCode?: number;
  message?: string;
  value: T;
}
type Response<T> = ResponseOriginal<T> | undefined;
//value
interface Value{
  item1: {name:string | null,num:number};
  item2: ArrayValueItem3 [];
  item3: any[];  //或any一步到位....
  }
interface ArrayValueItem3 {
  key:number | string,
  id:string,
  label:string
}

//接口
export const GetData = (
  id: ID
): Promise<Response<Value>> =>   //或Promise<Response<any>>不过这样未知value里面的数据
  get({
    url: `${http://10.0.1.1}/GetData`,
    config: { params: { id } },
  });

ts+axios案例

### 使用 TypeScript 封装 Axios 并处理 `code` 字段 为了更好地理解如何在 TypeScript 中封装 Axios 和处理返回值中的 `code` 字段,可以按照如下方式构建代码。 #### 创建 Axios 实例并配置默认参数 首先,在项目中创建一个新的 Axios 实例,并为其指定一些全局配置选项。这有助于统一管理请求的基础路径和其他常用属性: ```typescript // src/api/index.ts import axios from "axios"; const service = axios.create({ baseURL: process.env.NODE_ENV === 'development' ? '/' : (process.env.VITE_API_URL || '/'), timeout: 5000, headers: { 'Content-Type': 'application/json' } }); ``` 此部分展示了如何基于环境变量动态调整基础 URL[^3]。 #### 定义接口用于描述 API 响应的数据结构 接着定义一个或多个接口来精确表示服务器端可能返回的不同类型JSON 数据格式。对于包含 `code` 的情况来说,通常会有一个标准的成功/失败状态码以及相应的消息提示: ```typescript interface ApiResponse<T> { code: number; message?: string | null; result?: T; } ``` 这里的泛型 `<T>` 表示实际业务逻辑所需的具体数据类型[^1]。 #### 添加自定义拦截器以预处理响应 为了让应用程序能够更加灵活地应对不同的 HTTP 状态码和服务端反馈的信息,可以在 Axios 请求链路上加入定制化的拦截机制。特别是针对那些非成功的 HTTP 状态(如4xx 或者 5xx),可以通过这种方式提前捕获异常状况并向用户展示友好的警告信息: ```typescript service.interceptors.response.use( response => { const res = response.data as ApiResponse<any>; if (res.code !== 200) { // 这里可以根据具体的错误码做更细致的处理 Message.error(res.message ?? '未知错误'); return Promise.reject(new Error(res.message)); } return res.result; }, error => { let msg = ''; if (error && error.response) { switch (error.response.status) { case 400: msg = '请求错误'; break; case 401: msg = '未授权,请登录'; break; case 403: msg = '拒绝访问'; break; case 404: msg = `请求地址出错: ${error.response.config.url}`; break; case 408: msg = '请求超时'; break; case 500: msg = '服务器内部错误'; break; case 501: msg = '服务未实现'; break; case 502: msg = '网关错误'; break; case 503: msg = '服务不可用'; break; case 504: msg = '网关超时'; break; default: msg = '连接到服务器失败'; } } else { msg = error.message || '连接服务器失败'; } Message.error(msg); return Promise.reject(error); } ); ``` 上述代码片段实现了对接收到的服务端响应进行初步解析的功能,并依据特定条件执行不同操作[^4]。 #### 发起带有 `code` 字段验证的实际请求 最后一步就是利用前面准备好的工具去发起真正的网络调用了。假设现在要获取某个资源列表,则只需要简单地编写类似下面这样的函数即可完成整个流程: ```typescript async function fetchResourceList(): Promise<Resource[]> { try { const resources = await service.get<ApiResponse<Resource[]>>('/api/resources'); return resources; } catch (err) { throw err; } } fetchResourceList().then(data => console.log('Resources:', data)).catch(err => console.error('Error fetching resource list:', err)); ``` 这段代码通过显式指定了预期的结果类型为 `ApiResponse<Resource[]>` 来确保编译期间就能发现潜在的问题所在。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值