超实用TS提升开发效率的常用内置工具类

常用内置工具类

Omit 省略/排除

  • Omit是一个泛型类型,用于从一个给定的类型中排除某些属性,返回一个新的类型。它接收两个参数,第一个参数是需要omit操作的类型,第二个参数是需要排除的属性的名称或联合类型

  • 案例如下:

ts 复制代码
interface IUser {
  readonly name: string;
  age: number;
  sex: 0 | 1;
  address: string;
}
// 排除age、sex
type Person = Omit<IUser, "age" | "sex">;

let obj: Person = {
  name: "vhen",
  address: "上海",
};
  • Person 只有name与address属性了
  • Omit源码
ts 复制代码
type Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>;

Pick 选择

  • Pick是在已经定义的对象中选取所需属性

  • pick<T,keys>:从Type中选择一系列属性来构造新类型,属性来源于keys

  • pick两个类型变量:

    • T:表示选择谁的属性`
    • keys:表示选择哪几个属性(传入属性名,只能是第一个 类型变量中存在的属性)
  • 案例如下:

ts 复制代码
interface IUser {
  readonly name: string;
  age: number;
  sex: 0 | 1;
  address: string;
}
// 选取了age与sex属性
type Person = Pick<IUser, "age" | "sex">;

const obj: Person = {
  age: 18,
  sex: 0,
};
  • Person 只有age与sex属性了

  • Pick源码

ts 复制代码
type Pick<T, K extends keyof T> = {
  [P in K]: T[P];
};

Partial 可选项

  • Partial 已有的对象(必选+可选项)属性全部转化为可选属性

  • 案例如下:

ts 复制代码
interface IUser {
  readonly name: string;
  age: number;
  sex: 0 | 1;
  address: string;
}

type Person = Partial<IUser>;

const obj: Person = {
  age: 18,
};
  • Person 属性都转化为带?的可选属性
  • Partial 源码
ts 复制代码
type Partial<T> = { 
    [P in keyof T]?: T[P]; 
};

Required 必选项

  • RequiredPartial正好相反,已有的对象(必选+可选项)属性全部转化为必选属性

  • 案例如下:

ts 复制代码
interface IUser {
  readonly name?: string;
  age?: number;
  sex?: 0 | 1;
  address: string;
}

type Person = Required<IUser>;

const obj: Person = {
  name: "vhen",
  age: 18,
  address: "beijing",
  sex: 1,
};
  • Person属性全部转化为不带?必选属性
  • Required源码
ts 复制代码
type Required<T> = { 
    [P in keyof T]-?: T[P]; 
};

Readonly 只读

  • Readonly 已有的对象全部转化为带Readonly只读属性

  • 案例如下:

ts 复制代码
interface IUser {
  readonly name?: string;
  age?: number;
  sex: 0 | 1;
  address: string;
}

type Person = Readonly<IUser>;

// obj 所有属性不能修改,只能读取了
const obj: Person = {
  name: "vhen",
  age: 18,
  address: "beijing",
  sex: 1,
};
  • Person属性全部转化为带Readonly只读属性
  • Readonly源码
ts 复制代码
type Readonly<T> = {
  readonly [P in keyof T]: T[P];
};

Exclude 排除/不包括

  • Exclude <T,U> T属性排除U中已有的属性

  • 案例如下:

ts 复制代码
type A = string | number | boolean;
type B = number | boolean;
type Person = Exclude<A, B>;

let test: Person = 'vhen';
  • Person 只剩下string
  • Exclude源码
ts 复制代码
type Exclude<T, U> = T extends U ? never : T;

Extract 提取/包括

  • Extract <T, U>Exclude正好相反,提取T与U相同的属性

  • 案例如下:

ts 复制代码
type A = string | number | boolean | null;
type B = number | string;
type Person = Extract<A, B>;

let test: Person = "vhen";
  • Person 属性为 string、number
  • Extract 源码
ts 复制代码
type Extract<T, U> = T extends U ? T : never

ReturnType 函数的类型推导

  • ReturnType 获取函数返回值的类型

  • 案例如下:

ts 复制代码
function getUser() {
  return {
    name: "vhen",
    age: 18,
    address: "北京",
  };
}
type ReturnUser = ReturnType<typeof getUser>;推导出了getUser函数的返回类型
  • ReturnUser 推导出类型如下

  • ReturnType源码

ts 复制代码
type ReturnType<T extends (...args: any) => any> = T extends (...args: any) => infer R ? R : any;

NonNullable 类型中排除 nullundefined

- NonNullable从泛型 T 中排除掉 null 和 undefined

  • 案例如下:
ts 复制代码
type A = string | number | null | undefined;
type B = NonNullable<A>;
let test: B = "vhen";
  • B 去除了null、undefined
  • NonNullable 源码
ts 复制代码
type NonNullable<T> = T & {}; 
相关推荐
徐小夕@趣谈前端1 小时前
NO-CRM 2.0正式上线,Vue3+Echarts+NestJS实现的全栈CRM系统,用AI重新定义和实现客户管理系统
前端·javascript·人工智能·开源·编辑器·echarts
catino1 小时前
图片、文件上传
前端
Mr Xu_1 小时前
Vue3 + Element Plus 实现点击导航平滑滚动到页面指定位置
前端·javascript·vue.js
小王努力学编程1 小时前
LangChain——AI应用开发框架(核心组件1)
linux·服务器·前端·数据库·c++·人工智能·langchain
pas1362 小时前
35-mini-vue 实现组件更新功能
前端·javascript·vue.js
前端达人2 小时前
为什么聪明的工程师都在用TypeScript写AI辅助代码?
前端·javascript·人工智能·typescript·ecmascript
快乐点吧2 小时前
使用 data-属性和 CSS 属性选择器实现状态样式控制
前端·css
EndingCoder2 小时前
属性和参数装饰器
java·linux·前端·ubuntu·typescript
小二·2 小时前
Python Web 开发进阶实战:量子机器学习实验平台 —— 在 Flask + Vue 中集成 Qiskit 构建混合量子-经典 AI 应用
前端·人工智能·python
TTGGGFF3 小时前
控制系统建模仿真(十):实战篇——从工具掌握到工程化落地
前端·javascript·ajax