typescript和java很多类似的地方,javaScript 只会在 运行时 才去做数据类型检查,而 TypeScript 作为静态类型语言,其数据类型是在 编译期间 确定的,编写代码的时候要明确变量的数据类型。使用 TypeScript 后,这些低级错误将不再发生。规范后用起来很舒服,能轻易知道自己错在哪。下面就是axios的二次封装。 为了代码规范化
首先在路径下utils/http 文件下需要三个ts分步文件 core.ts (核心类的封装) index.ts(到处类的封装) types.ts(所用到的类型封装) 首先核心类的封装(core.ts)
import axios from 'axios'
import { AxiosInstance, AxiosRequestConfig, AxiosResponse, Method } from 'axios'
import { IResponseData, codeMessage } from './types';
import {successMessage,errorMessage} from '../messageTips'
class Http {
private service: AxiosInstance
constructor(config: AxiosRequestConfig) {
this.service = axios.create(config)
this.service.interceptors.request.use((config: AxiosRequestConfig) => {
return config
}, error => {
return Promise.reject(error)
})
this.service.interceptors.response.use((response: AxiosResponse) => {
const data = response.data
const { code } = data
if (code !== '000000') {
errorMessage(codeMessage[code])
}
return response.data
}, error => {
return Promise.reject(error)
})
}
public get<T>(url: string, params?: any): Promise<IResponseData<T>> {
return this.service.get(url, params)
}
public post<T>(url: string, params: any,): Promise<IResponseData<T>> {
return this.service.post(url, params)
}
public request<T>(method: Method, url: string, data?: any): Promise<IResponseData<T>> {
return this.service.request({ method, url, data })
}
}
export default Http
type.ts
export interface IResponseData<T> {
status: number;
message?:string;
data:T;
code: string;
}
export const codeMessage: { [key: number]: string } = {
200: "服务器成功返回请求的数据。",
201: "新建或修改数据成功。",
202: "一个请求已经进入后台排队(异步任务)。",
204: "删除数据成功。",
400: "发出的请求有错误,服务器没有进行新建或修改数据的操作。",
401: "用户没有权限(令牌、用户名、密码错误)。",
403: "用户得到授权,但是访问是被禁止的。",
404: "发出的请求针对的是不存在的记录,服务器没有进行操作。",
406: "请求的格式不可得。",
410: "请求的资源被永久删除,且不会再得到的。",
422: "当创建一个对象时,发生一个验证错误。",
500: "服务器发生错误,请检查服务器。",
502: "网关错误。",
503: "服务不可用,服务器暂时过载或维护。",
504: "网关超时。",
};
index.ts 实例出去
import Http from "./core";
import {AxiosRequestConfig} from 'axios'
const config:AxiosRequestConfig = {
baseURL:'/api',
timeout:10000
}
export default new Http(config)
使用如下,建议单独封装一下,加一个api文件
import http from "./utils/http/index";
http
.get("/user-tb/userlist")
.then((res) => {
console.log("这个是get成功");
console.log(res);
})
.catch((err) => {
console.log("失败1");
console.log(err);
});
http
.get("/user-tb/find/1")
.then((res) => {
console.log(2);
console.log(res);
})
.catch((err) => {
console.log("失败2");
console.log(err);
});
http
.request("get", "/user-tb/find/1")
.then((res) => {
console.log(res);
})
.catch((err) => {
console.log("失败3");
console.log(err);
});
},
接下来就是对于有些泛型接口的理解,比如这个T
export interface AxiosResponse {
data: any;
status: number;
statusText: string;
headers: any;
config: AxiosRequestConfig;
request: any;
}
export interface AxiosResponse<T = any> {
data: T;
status: number;
statusText: string;
headers: any;
config: AxiosRequestConfig;
request: any;
}
这里我们给 AxiosResponse 接口添加了泛型参数 T,T=any 表示泛型的类型参数默认值为 any。 有了这个泛型参数以后,我们在发送请求时就可以指定返回的data的类型了
export function getUserInfo<T>() {
return axios.get<ResponseData<T>>('/getuser')
.then(res => res.data)
.catch(err => console.error(err))
}
interface User {
name: string
age: number
}
async function test() {
const user = await getUser<User>()
}
新手小白,多多关照哦
|