TS封装类型判断

  • 封装基本判断方法

使用 Object.prototype.toString.call()方法判断是因为typeof只能判断基本数据类型,而不能判断一些复杂的引用数据类型,因此我们使用 Object.prototype.toString.call()

const toString = Object.prototype.toString;
export function is(val: unknown, type: string) {
    return toString.call(val) === `[object ${type}]`;
}
  • 判断值是否定义

export  function isDef<T = unknown>(val?:T):val is T{
    return typeof val!=='undefined';
}

//相反定义
export  function  isUnDef<T=unknown>(val:T):val is T{
    return !isDef(val);
}
  •  判断值是否是字符串

export function isString(val:unknown): val is string {
  return is(val,"String")
}
  • 判断值是否是Object

要判断Object类型,首先要判断值是否为null类型,因为null和undefined是所有类型的子类型,且在JS中typeof判断null时也是Object所以我们在使用Object.prototype.toString.call()方法判断前要先判断给定的值是否为nul,不能用instanceof是因为instanceof只是查找该对象是否存在原型链上,所以当在查找null和undefined的时候会报错,浏览器会报出不是Object类型错误

export function isObject(val: any):val is Record<any, any> {
  return val !== null && is(val, 'Object')
}
  • 判断值是否是数组

这里我们直接使用官方提供的Array.isArray()方法判断,在这之前我们还要判断该值是否存

export function isArray(val: any): val is Array<any> {
  // 检查数组是否存在如果存在则返回数组的类型
  return val && Array.isArray(val)
}
  • 判断是否是映射(Map)类型

export function isMap(val: unknown): val is Map<any, any> {
  return is(val, 'Map')
}
  •  判断值是否为Null

export function isNull(val: unknown):val is null {
  return val === null;
}
  • 判断值是否是空(长度为0不是Null)

首先我们要判断该值的类型,如果是数组和字符串可以直接通过length方法获取长度进行判断,如果是映射和集合我们可以通过size方法进行判断,如果是对象那么可以通过Object.keys()方法获取对象中所有的key值的数组然后判断该数组长度进行判断 

export function isEmpty<T = unknown>(val: T): val is T {
  if (isArray(val) || isString(val)) {
    return val.length === 0;
  }
  if (val instanceof Map || val instanceof Set) {
    return val.size === 0;
  }
  if (isObject(val)) {
    return Object.keys(val).length === 0;
  }
  return false;
}
  • 判断值是不是函数(Function)

export function isFunction(val: unknown) {
  return typeof val === 'function'
}
  • 判断值是不是Boolean类型

export function isBoolean(val: any) {
  return is(val, 'Boolean')
}
  • 判断是不是Number类型

export function isNumber(val: unknown):val is number {
  return is(val, 'Number');
}
  • 判断值是否是日期类型

export function isDate(val: unknown):val is Date {
  return is(val, 'Date');
}
  • 判断是不是正则表达式

正则表达式有自己的类型RegExp

export function isRegExp(val: unknown):val is RegExp {
  return is(val, 'RegExp');
}
  •  判断是不是Url地址

使用正则表达式进行判断

export function isUrl(path: string):boolean {
  const reg =
    /(((^https?:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+(?::\d+)?|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)$/;
  return reg.test(path);
}
  •  判断是不是Promise

export  function isPromise<T= any>(val:any):val is Promise<T>{
  return is(val,"Promise") && isFunction(val.then) && isFunction(val.catch)
}
  • 判断是不是原生JSON字符串

判断该字符串是否以“{”开头,是否以“}”结尾 

export function isJsonObjectString(val:string):val is string {
  if(!val) return false;
  return val.startsWith('{') && val.endsWith('}')
}
  • 判断是具有window环境

export function isWindow(val:any):val is Window {
  return typeof window !== 'undefined' && is(val,"Window");
}
  • 判断是否是浏览器HTMLElement

export function isElement(val:unknown):val is Element {
  return isObject(val) && !!val.tagName;
}
  • 判断是否是服务器端环境

export const isSever = typeof window === 'undefined';
  • 判断是否是客户端环境

export const isClient = !isSever;

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,以下是一个简单的封装 axios 的 React TypeScript 代码示例: ```typescript import axios, { AxiosRequestConfig, AxiosResponse } from 'axios'; interface ResponseData { code: number; data: any; message: string; } // 自定义错误类型 interface CustomError extends Error { response?: AxiosResponse<ResponseData>; } const instance = axios.create({ baseURL: 'https://your-api-url.com', timeout: 5000, }); // 请求拦截器 instance.interceptors.request.use( (config: AxiosRequestConfig) => { // 在请求发送之前做一些处理 return config; }, (error: CustomError) => { // 处理请求错误 return Promise.reject(error); } ); // 响应拦截器 instance.interceptors.response.use( (response: AxiosResponse<ResponseData>) => { // 对响应数据做一些处理 if (response.data.code !== 200) { // 如果返回的数据中 code 不是 200,说明请求出错 const error: CustomError = new Error(response.data.message); error.response = response; throw error; } return response.data; }, (error: CustomError) => { // 处理响应错误 return Promise.reject(error); } ); export default instance; ``` 这段代码中,我们首先定义了一个 `ResponseData` 接口,用于表示接口返回的数据格式。然后我们定义了一个 `CustomError` 接口,用于自定义错误类型,方便我们在拦截器中处理错误信息。接着我们创建了一个 axios 实例,并在实例中配置了一些基本信息,包括请求超时时间和请求的基础 URL。 接下来,我们定义了请求拦截器和响应拦截器。在请求拦截器中,我们可以对请求发送之前的一些处理,例如添加请求头或者对请求参数进行加密等。在响应拦截器中,我们可以对返回的数据进行处理,例如对错误码进行判断,或者对返回的数据进行格式化等。 最后,我们将我们封装好的 axios 实例导出,便于在项目中进行使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WDEP

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值