ts总结一下

发布于:2025-02-11 ⋅ 阅读:(7) ⋅ 点赞:(0)

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;
}

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