电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

TypeScript條件類型示例全面講解

瀏覽:16日期:2022-06-12 17:07:49
目錄Typescript 高階類型索引類型extendsReadonly 只讀Omit 排除某些字段Typescript 高階類型索引類型

keyof 會提取interface中的key

class KeyCls {name: stringage: number}type KeyClsExample1 = keyof KeyCls // name | agefunction getParams(params: keyof KeyCls) {}getParams('name') // 正常getParams('age') // 正常getParams('sex') // 報錯

in 可以遍歷枚舉類型

type Keys = 'a' | 'b'type Obj = {[p in Keys]: any;}// type Obj = {// a: any;// b: any;// }extendstype TExtends<T, U> = T extends U ? number : never;type TExtendExample = TExtends<number, number | string> // number// 聯合類型, 表示如果T中的類型是U的子集, 那么返回never, 否則返回T, 這個過程可以理解為對T中的類型進行一次遍歷, 每個類型都執行一次extendstype NonNullable1<T, U> = T extends U ? never : Ttype NonExample = NonNullable1<null | string, null | undefined> // string

Pick 英文意思挑選, 也就是從某種類型中挑選出一個或多個屬性

interface Todo {title: stringdesc: stringDone: boolean}type TodoPreview = Pick<Todo, 'Done'>// type TodoPreview = {// Done: boolean;// }// 實現type MyPick<T, K extends keyof T = keyof T> = {[P in K]: T[P]}// K in extends keyof T = keyof T, 意思是取值必須是在T的key上面取, 如果不傳遞取值默認為keyof T,所有的key, 內部取值是如果傳遞了K, 則屬性就在K中任意一個Readonly 只讀interface Todo {title: stringdesc: stringDone: boolean}const todo: Pick<Readonly<Todo>, 'title'> = {title: '你好'}todo.title = '啊啊啊'; // 無法為“title”賦值,因為它是只讀屬性// 實現type myReadonly<T> = {readonly [K in keyof T]: T[K]}// 分析: 通過keyof拿到所有的key屬性值組成聯合類型, 然后通過in遍歷類型,在屬性值前面加上readonly, 值value則是 T[K]// 通過上面案例還可以實現可選類型type myOptional<T> = {[K in keyof T]?: T[K]}

Exclude 語法: Exclude<T, U>, 返回 T 中不存在于 U 的部分

// 回顧extends// // 聯合類型, 表示如果T中的類型是U的子集, 那么返回never, 否則返回T, 這個過程可以理解為對T中的類型進行一次遍歷, 每個類型都執行一次extends// type NonNullable1<T, U> = T extends U ? never : T// type NonExample = NonNullable1<null | string, null | undefined> // string// 自己實現Excludetype myExclude<T, U> = T extends U ? never : T// 測試// 分析: 對T也就是'a'|'b'遍歷, a extends 'a'|'b', 返回never, 'b', 'a'|'c',返回'b', 所以上面的返回'b'type excludeExample = myExclude<'a' | 'b', 'a' | 'c'> // 'b'

Partial 將傳入的屬性變為可選項

interface Todo {title: stringdesc: stringDone: boolean}type Partial<T> = {[P in keyof T]?: T[P]}type KeyOfExample1 = Partial<Todo>let keyofEx1: KeyOfExample1 = {title: '1'}

-? 將可選項代表的 ?去掉, 將該類型變成必選項, 與之對應的還有一個+?,是將可選項變成必選項

interface Todo {title: stringdesc: stringDone: boolean}type Mutable<T> = {-readonly [P in keyof T]: T[P]}type mutableExample = Mutable<Readonly<Todo>>// 將Todo變成可讀之后再變成可寫

Required 將傳入的屬性變成必選項

type Required<T> = {[P in keyof T]-?: T[P]}class KeyCls {name?: string;age?: number;}const requiredExample: Required<KeyCls> = {name: 'John',} // 報錯const requiredExample2: Required<KeyCls> = {name: 'John',age: 20,} // 正常

Record<K, T> 將K中所有的屬性轉化為T類型

type myRecord<K extends keyof any, T> = {[P in K]: T}enum Methods {GET = 'get',POST = 'post',DELETE = 'delete',PUT = 'put',}type IRouter = myRecord<Methods, (req: any, res: any) => void>// type IRouter = {// get: (req: any, res: any) => void;// post: (req: any, res: any) => void;// delete: (req: any, res: any) => void;// put: (req: any, res: any) => void;// }Omit 排除某些字段// 已經學習了Pick和Exclude, 則可以利用這兩個實現Omitclass KeyCls {name: string;age: number;}// 假設 T 為 KeyCls, K為name, 結果是 // type myOmit<KeyCls, 'name'>// { // age: number; // }// 只需要實現成這樣就行了, 也就是獲取到agetype myOmit<T, K extends keyof T> = Pick<T, 'age'>// 排除name, 按照上面的 Exclude<'name' | 'age', 'name'> // 'age'type myOmit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>// 測試type myOmitExample = myOmit<KeyCls, 'name'>;// type myOmitExample = { // age: number; // }

NonNullable<T>:作用是去掉 T 中的 null 和 undefined。T 為字面量/具體類型的聯合類型

// 4.8版本之前type NonNullable<T> = T extends null | undefined ? never : T;// 4.8版本之后type NonNullable<T> = T & {}

infer 可以推薦一個類型變量, 相當于生命一個類型變量, 這個變量的類型取決于傳入的泛型T

type F<T> = T extends () => infer R ? R : T;type F1 = F<string> // stringtype TObj<T> = T extends { name: infer V, age: infer U } ? V : Ttype TObjExample2 = TObj<{name: number;age: string;}>; // number;

ReturnType<T> 獲取函數返回值的類型

type ReturnType<T> = T extends (...args: any[]) => infer R ? R : any;functin getUser() { return {name: 'xxx',age: 20 }}type GetUserType = typeof getUser;// type GetUserType = () => {// name: string;// age: number;// }type ReturnUser = ReturnType<GetUserType>type ReturnUser = {// name: string;// age: number;// }

以上就是TypeScript條件類型的詳細內容,更多關于TypeScript條件類型的資料請關注好吧啦網其它相關文章!

標簽: JavaScript
主站蜘蛛池模板: 湖南印刷厂|长沙印刷公司|画册印刷|挂历印刷|台历印刷|杂志印刷-乐成印刷 | 净化工程_无尘车间_无尘车间装修-广州科凌净化工程有限公司 | 脑钠肽-白介素4|白介素8试剂盒-研域(上海)化学试剂有限公司 | 高通量组织研磨仪-多样品组织研磨仪-全自动组织研磨仪-研磨者科技(广州)有限公司 | 【法利莱住人集装箱厂家】—活动集装箱房,集装箱租赁_大品牌,更放心 | 板框压滤机-隔膜压滤机-厢式压滤机生产厂家-禹州市君工机械设备有限公司 | 广州印刷厂_广州彩印厂-广州艺彩印务有限公司 | 垃圾处理设备_餐厨垃圾处理设备_厨余垃圾处理设备_果蔬垃圾处理设备-深圳市三盛环保科技有限公司 | 棉柔巾代加工_洗脸巾oem_一次性毛巾_浴巾生产厂家-杭州禾壹卫品科技有限公司 | 临沂招聘网_人才市场_招聘信息_求职招聘找工作请认准【马头商标】 | 超声波清洗机_细胞破碎仪_实验室超声仪器_恒温水浴-广东洁盟深那仪器 | 编织人生 - 权威手工编织网站,编织爱好者学习毛衣编织的门户网站,织毛衣就上编织人生网-编织人生 | 不锈钢/气体/液体玻璃转子流量计(防腐,选型,规格)-常州天晟热工仪表有限公司【官网】 | 球磨机 选矿球磨机 棒磨机 浮选机 分级机 选矿设备厂家 | 高压油管,液压接头,液压附件-烟台市正诚液压附件 | 广州中央空调回收,二手中央空调回收,旧空调回收,制冷设备回收,冷气机组回收公司-广州益夫制冷设备回收公司 | 除尘器布袋骨架,除尘器滤袋,除尘器骨架,电磁脉冲阀膜片,卸灰阀,螺旋输送机-泊头市天润环保机械设备有限公司 | SDG吸附剂,SDG酸气吸附剂,干式酸性气体吸收剂生产厂家,超过20年生产使用经验。 - 富莱尔环保设备公司(原名天津市武清县环保设备厂) | 深圳美安可自动化设备有限公司,喷码机,定制喷码机,二维码喷码机,深圳喷码机,纸箱喷码机,东莞喷码机 UV喷码机,日期喷码机,鸡蛋喷码机,管芯喷码机,管内壁喷码机,喷码机厂家 | 锂电混合机-新能源混合机-正极材料混料机-高镍,三元材料混料机-负极,包覆混合机-贝尔专业混合混料搅拌机械系统设备厂家 | 暖气片十大品牌厂家_铜铝复合暖气片厂家_暖气片什么牌子好_欣鑫达散热器 | 刘秘书_你身边专业的工作范文写作小秘书 | 建筑资质代办_工程施工资质办理_资质代办公司_北京众聚企服 | 户外-组合-幼儿园-不锈钢-儿童-滑滑梯-床-玩具-淘气堡-厂家-价格 | 深圳市人通智能科技有限公司 | 山东限矩型液力偶合器_液力耦合器易熔塞厂家-淄博市汇川源机械厂 | 污水处理设备,一体化泵站,一体化净水设备-「梦之洁环保设备厂家」 | EFM 022静电场测试仪-套帽式风量计-静电平板监测器-上海民仪电子有限公司 | 江苏齐宝进出口贸易有限公司| 温泉机设备|温泉小镇规划设计|碳酸泉设备 - 大连连邦温泉科技 | 分类168信息网 - 分类信息网 免费发布与查询 | 高扬程排污泵_隔膜泵_磁力泵_节能自吸离心水泵厂家-【上海博洋】 | 中央空调维修、中央空调保养、螺杆压缩机维修-苏州东菱空调 | 铝合金重力铸造_铝合金翻砂铸造_铝铸件厂家-东莞市铝得旺五金制品有限公司 | 重庆小面培训_重庆小面技术培训学习班哪家好【终身免费复学】 | 深圳侦探联系方式_深圳小三调查取证公司_深圳小三分离机构 | 聚氨酯催化剂K15,延迟催化剂SA-1,叔胺延迟催化剂,DBU,二甲基哌嗪,催化剂TMR-2,-聚氨酯催化剂生产厂家 | 低噪声电流前置放大器-SR570电流前置放大器-深圳市嘉士达精密仪器有限公司 | 立式壁挂广告机厂家-红外电容触摸一体机价格-华邦瀛 | 深圳诚暄fpc首页-柔性线路板,fpc柔性线路板打样生产厂家 | 捷码低代码平台 - 3D数字孪生_大数据可视化开发平台「免费体验」 |