学习过程中的简单记录,若问题敬请指教!文章持续更新中...
路过的朋友,可以点个赞,关注一下~~~
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]
}
原理解析
主要的逻辑就是如何利用泛型和联合类型,来动态的从一个已知的类型中,提取出它的子集。
-
K extends keyof T:
用来获取 T 类型的所有键的联合类型。
// 定义一个学生的属性类型
interface Student {
name: string;
age: number;
sex: string;
ranking: number;
}
// Student 所有键的联合类型
type Keys = keyof Student; // 等效于 "name" | "age" | "sex" | "ranking"
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];
};
Omit
与 Pick
作用相似,只不过 Omit
是:以一个类型为基础支持剔除某些属性,然后返回一个新类型。
3. 总结
Pick
:从类型对象中取出指定的属性类型Omit
:从类型对象中排出 指定的属性类型,得到剩余的属性类型
后记
本文纯仅属于个人的一些简单的见解,比较浅显,若有不妥之处还请不吝赐教!!!(☆_☆)
如果本文对你有所帮助,欢迎点赞!!!
o( ̄▽ ̄)d