持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第5天,点击查看活动详情
强烈建议先看上一篇:TypeScript中工具类型的使用与源码理解(一):Extract、Exclude、Record
-
PickPick用来抓取某种数据类型的属性,但实际工作中,主要用来提取接口或type定义的对象类型中的属性。- 源码
// 通过K extends keyof T,将K的范围约束在T的属性名组成的联合类型中 // [P in K]: T[P],将K迭代,并确认各个属性的相应的类型 type Pick<T, K extends keyof T> = { [P in K]: T[P]; }; - 示例
// PickTest最终类型为 // type PickTest = { // id: number; // name: string; // } type PickTest = Pick<GoodsType, 'id' | 'name'>
- 源码
-
OmitOmit功能与Pick相反,用来去除不需要的属性- 源码
// 通过`Exclude<keyof T, K>`获取**不包含在类型`K`之内**的所有属性名组成的联合类型 // 通过`Pick<T, Exclude<keyof T, K>>`,生成包含上述属性的对象类型 type Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>; - 示例
interface ReturnInterface { code: number msg: string } // RequiredTest最终类型为 // type RequiredTest = { // msg: string // } type RequiredTest = Omit<ReturnInterface, 'code'>
- 源码
-
RequiredRequired用来接口或type定义的对象类型中的可选属性转换成必选属性。- 源码
type Required<T> = { // 迭代T的属性名组成的联合类型,将T中每个属性中代表可选的"?"去除 [P in keyof T]-?: T[P]; }; - 示例:
interface ReturnInterface { code: number msg?: string } // RequiredTest最终类型为 // type RequiredTest = { // code: number // msg: string // } type RequiredTest = Required<ReturnInterface>
- 源码
-
PartialPartial与Required的功能正好相反,用来接口或type定义的对象类型中的所有属性转换成可选属性。- 源码
type Partial<T> = { // 迭代T的属性名组成的联合类型,将T中每个属性后添加代表可选的"?"。 [P in keyof T]?: T[P]; }; - 示例:
interface ReturnInterface { code: number msg?: string } // RequiredTest最终类型为 // type RequiredTest = { // code?: number // msg?: string // } type RequiredTest = Required<ReturnInterface>
- 源码
-
Readonly用来接口或type定义的对象类型中的所有属性转换成只读属性。
- 源码
type Readonly<T> = { readonly [P in keyof T]: T[P]; }; - 示例:
interface ReturnInterface { code: number msg?: string } // RequiredTest最终类型为 // type RequiredTest = { // readonly code: number // readonly msg?: string // } type RequiredTest = Readonly<ReturnInterface>
- 源码