超实用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 & {}; 
相关推荐
纯爱掌门人8 分钟前
别再死磕框架了!你的技术路线图该更新了
前端·架构·前端框架
没头脑的男大11 分钟前
Unet实现脑肿瘤分割检测
开发语言·javascript·ecmascript
丁点阳光18 分钟前
Ract Router v7:最全基础与高级用法指南(可直接上手)
前端·react.js
~无忧花开~27 分钟前
Vue.config.js配置全攻略
开发语言·前端·javascript·vue.js
w***Q3501 小时前
前端跨平台开发工具,Tauri与Electron
前端·javascript·electron
前端一课1 小时前
H5 WebView 文件下载到手机中(仅安卓与 iOS)
前端
幸会同学1 小时前
在Cesium中实现飘动的红旗
javascript·three.js·cesium
天外来物2 小时前
element-plus主题配置及动态切换主题
前端·css·element
flypwn2 小时前
justCTF 2025JSpositive_player知识
开发语言·javascript·原型模式
晴殇i2 小时前
这个前端工具杀疯了!发布一周狂揽 10k Star,Snapchat 开源框架重新定义跨平台
前端·程序员