当前位置: 首页 > article >正文

ts总结一下

ts基础应用

/**
 * 泛型工具类型
 */
interface IProps {
  id: string;
  title: string;
  children: number[];
}
type omita = Omit<IProps, 'id' | 'title'>;
const omitaA: omita = {
  children: [1]
};
type picka = Pick<IProps, 'id' | 'title'>;
const pickaA: picka = {
  id: '',
  title: '1'
};
type partiala = Partial<IProps>;
const partialaA: partiala = {
  id: '1'
};
type readonlya = Readonly<IProps>;
const readonlyaA: readonlya = {
  id: '1',
  title: '1',
  children: [1]
};
//Record<keys,Type>构造一个对象类型,属性键为keys,属性类型为Type
type recorda = Record<'a' | 'b' | 'c', string[]>;
const recordaA: recorda = {
  a: ['1'],
  b: ['1'],
  c: ['1']
};

/**
 * 泛型函数 箭头函数和普通函数
 */

// 箭头函数写法
const getValue = <T>(value: T): T => {
  return value;
};
// 声明函数写法
function getValue1<T>(value: T): T {
  return value;
}

getValue<number>(1);
getValue1(false); //类型推断为字面量类型100

// 多个参数
function getArr<K, V>(value1: K, value2: V): [K, V] {
  return [value1, value2];
}

/**
 * 泛型约束
 * 使用extends关键字为泛型添加约束
 * keyof关键字获取对象所有键的集合
 */
interface Ilength {
  length: number;
}
const getLength = <T extends Ilength>(value: T): number => {
  return value.length;
};

const getProp = <T, k extends keyof T>(obj: T, key: k) => {
  return obj[key];
};
getProp({ name: 'name', age: 1 }, 'name');

/**
 * 索引签名类型
 * 定义对象和数组
 */

interface IAnyObj<T> {
  [key: string]: T;
}

const myObj: IAnyObj<string> = {
  name: 'name'
};

interface IAnyArray<T> {
  [index: number]: T;
}

const myArray: IAnyArray<number> = [1, 2];

/**
 * 映射类型 in (keyof)
 * typeof
 */

type Person = { name: string; age: number };
type PerKeyof = keyof Person; // keyof后接类型 name | age
const per1: PerKeyof = 'age';

const person: Person = { name: 'name', age: 1 };
type PerTypeof = typeof person; // typeof后接具体对象
const per2: PerTypeof = { name: 'name', age: 1 };
// 用法1: 根据联合类型创建新类型
type PropKeys = 'x' | 'y' | 'z'; // const a: PropKeys = 'x';
// 等价于{x:string;y:string;z:string} 三个属性都包含
type types = { [key in PropKeys]: string };
const typesObj: types = {
  x: '1',
  y: '1',
  z: '1'
};
// 用法2: 根据对象类型创建新类型
type PropsObj = { a: number; b: string; c: boolean };
type Type1 = { [key in keyof PropsObj]: PropsObj[key] };
const Type1Obj: Type1 = {
  a: 1,
  b: '1',
  c: true
};

// 泛型工具partial是根据映射类型实现的
type MyPartial<T> = {
  [key in keyof T]?: T[key];
};
type MyPartialA = {
  name: string;
  age: number;
  phone: number;
};
const MyPartialAObj: MyPartial<MyPartialA> = {
  name: '1'
};
// 注意区分和in keyof的区别
const MyPartialAObj1: { [p in keyof MyPartialA]: MyPartialA[p] } = {
  name: '1' // 类型“{ name: string; }”缺少类型“{ name: string; age: number; phone:
};

当在公司axios严格使用ts

和后端定义好接口返回参数,使用泛型定义好核心data结构
AxiosResponse是axios返回的一个类型,带一个泛型参数T,属性有config,headers,request,status,statusText和data属性,其中data接受泛型T

// /api/index.ts
import axios, { AxiosResponse } from 'axios';
import config from '@/utils/config';
// 定义接口返回失败参数类型
interface ErrorResponse {
  error_code: string;
  error_message: string;
}

// 定义接口返回成功参数类型
interface AxiosHomeResponse<T = any> {
  data: T;
  stateCode?: {
    code?: string;
    desc?: string;
  };
  statusText?: string;
  success?: boolean;
}
export type BaseResponse<T> = Promise<AxiosResponse<T>>;

// 封装接口返回参数类型
export type HomeResponse<T> = BaseResponse<AxiosHomeResponse<T> & ErrorResponse>;
/**
 * 设置全局配置
 */
axios.defaults.withCredentials = true;
axios.defaults.validateStatus = (status: number) => {
  return status >= 200 && status < 599;
};

export const createAxios = (baseURL: string) => {
  const instance = axios.create({ baseURL });
  instance.interceptors.request.use(
    (config) => {
      if (config.method?.toLocaleLowerCase() === 'get') {
        config.params = { ...config.params, _: Date.now() };
      }
      return config;
    },
    (error) => {
      // 对请求错误做些什么
      return Promise.reject(error);
    }
  );
  instance.interceptors.response.use(
    (response) => {
      // 对响应数据做点什么
      switch (response.status) {
        case 401:
          // 跳转登陆页面
          break;
      }
      return response;
    },
    (error) => {
      // 对响应错误做点什么
      if (error.response && error.response.data) {
        // 弹出统一错误提示
      }
      return Promise.reject(error);
    }
  );
  return instance;
};

// test接口
/**
 * url: http://localhost:3001/api
 * 不同环境的url可以抽离到config下的配置文件 todo...
 * 不同模块的请求域名可以各自配置
 */
export const homeApi = createAxios('http://localhost:3001/api');

在文件夹api中分模块定义请求接口和ts类型

// /api/home/index.ts
import { homeApi, HomeResponse } from '..';
import * as Types from './type';

// 拿到接口返回的res就有ts类型提示了
export const getHome = (params: Types.IHomeParams): HomeResponse<Types.IHomeRes[]> => {
  return homeApi.post('/home', { params });
};

// /api/home/type.ts
export interface IHomeParams {
  id: number;
}

export interface IHomeRes extends IHomeParams {
  msg: string;
}

在请求结果中就会有对应的提示了
在这里插入图片描述
在这里插入图片描述


http://www.kler.cn/a/464346.html

相关文章:

  • Unity3D仿星露谷物语开发16之角色拾取道具
  • SAP SD销售模块常见BAPI函数
  • 基于51单片机和16X16LED点阵屏(74HC138和74HC595驱动)的小游戏《贪吃蛇》
  • Tailwind CSS 实战:动画效果设计与实现
  • RS485方向自动控制电路分享
  • 电子电气架构 --- 中央处理器HPC及软件架构
  • 《CCSIP 2024中国网络安全产业全景册(第七版)》
  • 深入了解多模态深度学习:概述与未来发展
  • 基于Hadoop的物品租赁系统的设计与实现-springboot+vue
  • 单片机常用外设开发流程(1)(IMX6ULL为例)
  • MarkDown 的 mermaid gantt(甘特图)、mermaid sequenceDiagram (流程图) 语法解析和应用
  • SQL Server 架构、数据库文件组和数据库对象
  • 自动化删除work32挖矿脚本
  • windows C#-字符串和字符串字面量(一)
  • 力扣hot100——图论
  • Cauchy-Schwarz不等式:向量内积的“上限卫士”,帮你衡量向量有多“同向”
  • 数据挖掘——神经网络分类
  • df.replace({‘b‘: ‘.‘}, {‘b‘: np.nan})
  • SpringMVC(四)响应
  • 【Go学习】-01-1-入门及变量常量指针
  • R语言基础| 广义线性模型
  • 【可实战】需求分析-测试计划↓-测试设计-测试执行-测试总结↓(包含测试计划、测试总结模板,以公司要求为准)
  • 【Unity3D】基于UGUI——简易版 UI框架
  • PgSQL如何用cmd命令行备份和还原数据库
  • SQLALchemy如何将SQL语句编译为特定数据库方言
  • Windows11 安卓子系统存储位置更改