TypeSctipe高级类型之Pick与Omit详解

35 阅读2分钟

学习过程中的简单记录,若问题敬请指教!文章持续更新中...

路过的朋友,可以点个赞,关注一下~~~

1. Pick 详解

定义

Pick<T, K>动态的从一个已知复合类型 T 中取出几个想要的属性 K,构造一个新类型。

使用

Pick<要拾取的类型,要拾取的属性1,要拾取的属性2,....>

实用场景

主要从一个已知的类型中,取出子集,作为一个新的类型返回

// 定义一个学生的属性类型
interface Student {
    name: string;
    age: number;
    sex: string;
    ranking: number;
}

// 定义一个可编辑学生信息的类型 (姓名、年龄)
type EditSutdent = Pick<Student, 'name', 'age'>

// 此时EditSutdent 等效于 IEditStudent
interface IEditStudent {
    name: string;
    age: number;
}


Pick实现源码

type Pick<T,K extends keyof T> = {
    [P in K]: T[P]
}

原理解析

主要的逻辑就是如何利用泛型和联合类型,来动态的从一个已知的类型中,提取出它的子集。

  1. K extends keyof T:

    用来获取 T 类型的所有键的联合类型。

// 定义一个学生的属性类型
interface Student {
  name: string;
  age: number;
  sex: string;
  ranking: number;
}

// Student 所有键的联合类型
type Keys = keyof Student; // 等效于 "name" | "age" | "sex" | "ranking"
  1. P in K in 操作符可以遍历联合类型,枚举类型等…
// 定义一个学生的属性类型
interface Student {
  name: string;
  age: number;
  sex: string;
  ranking: number;
}

// Student 所有键的联合类型
type Keys = keyof Student; // 等效于 "name" | "age" | "sex" | "ranking"

// 此时 ManStudent 类型 与 Student相等
type ManStudent = {
  [key in Keys]: Student[key];
};

代码运行示例图

2. Omit 详解

定义

Omit<T, K>动态的从一个已知复合类型 T 中排除不想要的属性 K,构造一个新类型。

使用

Omit<要排除的类型,要拾排除的属性1,要排除的属性2,....>

实用场景

主要从一个对象中,排除某些属性,作为一个新的类型返回

// 定义一个学生的属性类型
interface Student {
    name: string;
    age: number;
    sex: string;
    ranking: number;
}

// 定义一个可编辑学生信息的类型 不含名次
type EditSutdent = Omit<Student, 'ranking'>

// 此时EditSutdent 等效于 IEditStudent
interface IEditStudent {
    name: string;
    age: number;
    sex: string;
}


Omit实现源码

type Omit<T, K extends string | number | symbol> = {
  [P in Exclude<keyof T, K>]: T[P];
};

OmitPick 作用相似,只不过 Omit 是:以一个类型为基础支持剔除某些属性,然后返回一个新类型。

3. 总结

  • Pick:从类型对象中取出指定的属性类型
  • Omit:从类型对象中排出 指定的属性类型,得到剩余的属性类型

后记

本文纯仅属于个人的一些简单的见解,比较浅显,若有不妥之处还请不吝赐教!!!(☆_☆)

如果本文对你有所帮助,欢迎点赞!!!

o( ̄▽ ̄)d