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: "成功"
});
相关推荐
哆啦A梦15882 小时前
搜索页面布局
前端·vue.js·node.js
_院长大人_2 小时前
el-table-column show-overflow-tooltip 只能显示纯文本,无法渲染 <p> 标签
前端·javascript·vue.js
SevgiliD2 小时前
el-table中控制单列内容多行超出省略及tooltip
javascript·vue.js·elementui
哆啦A梦15884 小时前
axios 的二次封装
前端·vue.js·node.js
阿珊和她的猫4 小时前
深入理解与手写发布订阅模式
开发语言·前端·javascript·vue.js·ecmascript·状态模式
爱看书的小沐5 小时前
【小沐杂货铺】基于Three.js渲染三维风力发电机(WebGL、vue、react、WindTurbine)
javascript·vue.js·webgl·three.js·opengl·风力发电机·windturbine
罚时大师月色7 小时前
Vue+ts 如何实现父组件和子组件通信
javascript·vue.js·ecmascript
fury_1237 小时前
vue3:数组的.includes方法怎么使用
前端·javascript·vue.js
宁&沉沦8 小时前
Cursor 科技感的登录页面提示词
前端·javascript·vue.js
武天8 小时前
如果使用Vue3.0实现一个 Modal,你会怎么进行设计?
vue.js