Vue3 》》vite》》TS》》封装 axios ,Promise<T>

封装 axios

typescript 复制代码
// src/env.d.ts
// env.d.ts   
// 路径无所谓
interface ImportMetaEnv {
  readonly VITE_BASE_URL: string
  readonly VITE_TIMEOUT: Number
}

interface ImportMeta {
  readonly env: ImportMetaEnv
}


typescript 复制代码
//src/utils/axios.ts
import axios from "axios"
import { ElMessage } from 'element-plus'
//实例配置
const request = axios.create({
    baseURL: import.meta.env.VITE_BASE_URL,//从环境变量获取基础路径
    timeout: 3000,
})
//为实例配置请求拦截器
request.interceptors.request.use(config => {
    // config 配置对象
    console.log(import.meta.env)
    console.log(config)
    return config;
},err=>{
    console.log(err)
})
//为实例配置响应拦截器
request.interceptors.response.use(res=>{
    //成功回调
    //简化数据
    return res.data;
},err=>{
    //失败回调:处理http网络错误
    //定义一个变量:存储网络错误
    let message = ""
    //http 状态
    let status = err.response.status
    switch(status){
        case 401:
            message = "token无效"
            break
        case 403:
            message = "无权访问"
            break
        case 404:
            message = "请求地址有误"
            break
        case 500:
            message = "服务处理故障"
            break
        default:
            message = "网络故障"
            break
    }
    // 提示错误信息
    ElMessage({
        type:'error',
        message
    })
    return Promise.reject(err)
})
export {request}

vue 应用

ts 声明文件

》》为了能点出来 需要设置 声明文件 d.ts

typescript 复制代码
// src/env.d.ts   推荐  这个  
// env.d.ts   
// 路径无所谓
interface ImportMetaEnv {
  readonly VITE_BASE_URL: string
  readonly VITE_TIMEOUT: Number
}

interface ImportMeta {
  readonly env: ImportMetaEnv
}
typescript 复制代码
项目/
├── src/
│   ├── env.d.ts          # 环境变量类型定义(推荐位置)
│   ├── main.ts
│   ├── App.vue
│   └── ...
├── .env                  # 环境变量文件
├── .env.development
├── .env.production
├── tsconfig.json
└── vite.config.ts

实现文件 声明文件

vite 下的 axios 类型解析




typescript 复制代码
interface User {
  id: number;
  name: string;
}

interface ApiResponse {
  data: User[];
  total: number;
}

// 请求配置
const config: AxiosRequestConfig = {
  timeout: 5000,
  headers: {'X-Custom-Header': 'value'}
};

const response = await axios.get<User, AxiosResponse<ApiResponse>>(
  '/api/users', 
  config
);

// 现在 TypeScript 有完整的类型提示:
console.log(response.data.data[0].name);    // ✅ 类型安全
console.log(response.status);               // ✅ AxiosResponse 的属性

axios ===》 Promise



typescript 复制代码
1. 基本数据类型
// Promise 返回 string
const namePromise: Promise<string> = Promise.resolve("张三");

// Promise 返回 number
const agePromise: Promise<number> = Promise.resolve(25);

// Promise 返回 boolean
const isActivePromise: Promise<boolean> = Promise.resolve(true);

2. 对象类型

interface User {
    id: number;
    name: string;
    email: string;
}

// Promise 返回 User 对象
const userPromise: Promise<User> = Promise.resolve({
    id: 1,
    name: "李xx",
    email: "xx@example.com"
});

3. 数组类型

interface User {
    id: number;
    name: string;
    email?: string;
}
// Promise 返回 User 数组
const usersPromise: Promise<User[]> = Promise.resolve([
    { id: 1, name: "张三" },
    { id: 2, name: "李四",  email: "xx@example.com"}
]);

4. 复杂类型
interface User {
    id: number;
    name: string;
}
interface ApiResponse<T> {
    data: T;
    status: number;
    message: string;
}

// Promise 返回复杂的 ApiResponse
const responsePromise: Promise<ApiResponse<User[]>> = Promise.resolve({
    data: [{ id: 1, name: "王五" }],
    status: 200,
    message: "成功"
});
相关推荐
梦梦代码精16 小时前
2026年PHP开源商城系统实测对比:架构、多商户、商用授权,谁才是真·省心?
vue.js·docker·架构·开源·代码规范
naildingding19 小时前
3-ts接口 Interface
前端·typescript
ZengLiangYi19 小时前
TypeScript 项目配置:tsconfig、ESM、路径别名
javascript·typescript·aigc
拉拉肥_King20 小时前
Vue 3 主题切换深度解析:从炫酷动画到零闪烁方案
前端·vue.js
杨梦馨1 天前
万级数据表格卡死?Web Worker 一招搞定
前端·javascript·vue.js
哈撒Ki1 天前
快速入门vue3与常见面试题
前端·vue.js·面试
云水一下1 天前
Vue.js从零到精通系列(一):初识Vue——背景、环境与第一个应用
前端·javascript·vue.js
云水一下1 天前
Vue.js从零到精通系列(二):响应式核心——ref、reactive、computed与watch
前端·javascript·vue.js
退休倒计时1 天前
【每日一题】LeetCode 15. 三数之和 TypeScript
数据结构·算法·leetcode·typescript
卤蛋fg61 天前
vxe-table 列拖拽排序与行拖拽排序:让表格布局任意排序
vue.js