当前位置: 首页 > Web前端 > HTML

TypeScript常用工具类型Omit,Pick,Partial,Required,Exclude,Extract

时间:2023-03-27 23:25:35 HTML

TS中常用的工具映射类型大大提高了编写TS的效率,避免了无意义的重复定义。1.Omit省略/去除顾名思义,可以去除定义对象中不需要的部分,形成新的定义类型。接口UserObj{只读名称:字符串;//readonly只读属性只能初始化和定义,不能赋值两次age:number;身份证号;性别:0|1;地址:字符串;weight:number;}//消除自己不必要的类型Person=Omit;//此时Person相当于Person1interfacePerson1{readonlyname:string;id:number;}//Omit类型源码Omit=Pick>;2.Pickcollection,顾名思义,可以收集你需要的部分定义对象,组成一个新的定义类型。接口UserObj{只读名称:字符串;年龄:数字;身份证号;性别:0|1;地址:字符串;重量:数量;}//类型Person=Pick;//此时Person等同于Person1interfacePerson1{readonlyname:string;id:number;}//Pick的源码类型Pick={[PinK]:T[P];};3.Partial可以将所有定义的对象类型(包括强制+可选)转换为可选//已经定义的类型PersoninterfacePerson{name:string;年龄:数字;身份证号;性别:0|1;地址:字符串;weight:number;}//使用方法constnewObj:Partial={name:'张三'//如果只需要Partial的方便,不需要重新定义type};//Partial等同于NewPersoninterfaceNewPerson{name?:string;年龄?:数字;身份证号;性别?:0|1;地址?:字符串;weight?:number;}Partial的源代码很简单,你可以实现一个简单版本的typePartial={[PinkeyofT]?:T[P];};(包括required+optional)所有类型都转换为requiredOption//已经定义的类型PersoninterfacePerson{name:string;年龄:数字;身份证号;性别?:0|1;}//usemethodconstnewObj:Required={name:'张三',age:1,id:1,sex:1};//Required相当于NewPerson接口NewPerson{name:细绳;年龄:数字;身份证号;性别:0|1;}Required的源码实现也很简单,“-?”表示去除可选属性/***使T中的所有属性成为必需的*/typeRequired={[PinkeyofT]-?:T[P];};5.Readonly(转换只读)Readonly是给类型object的每一项加上前缀ReadonlyinterfacePerson{readonlyname:string;//只有这个项目有readonlyage:number;id?:number;}//使用方法constnewObj:Readonly={name:'张三',age:1,id:1};//newObj.name='李四';//异常具有readonly只读属性,所以只能初始化声明,不能赋值//Readonly等同于NewPersoninterfaceNewPerson{readonlyname:string;只读年龄:数字;readonlyid?:number;}Readonly的源码实现也很简单/***将T中的所有属性设为readonly*/typeReadonly={readonly[PinkeyofT]:T[P];};6.Extract(extract/include)//Extract实现源码原理很简单typeExtract=TextendsU?T:never;interfacePerson{name:string;}interfaceNewPerson{name:string;年龄:数字;id:number;}//情况1//如果NewPersonextendsinheritsfromPerson(继承Person的属性),则返回NewPerson,否则返回永不异常constobj:Extract={name:'',age:1、id:1}Extract相当于NewPerson7.Exclude(exclude/notinclude)而Extract正好相反//ExcludesourcecodetypeExclude=TextendsU?从不:T;interfacePerson{name:string;}interfaceNewPerson{name:string;年龄:数字;id:number;}//情况1//如果PersonextendsinheritsfromNewPerson(继承NewPerson的属性),永远不会异常,否则返回Personconstobj:Exclude={name:''}Exclude这时候就相当于Person要继续了。有时间的话,添加一些不常用的内置制图工具类和自定义工具类