范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

从React源码的类型定义中,我学到了什么?

  今天看了下 React 的类型定义,也就是 @types/react 包下的 index.d.ts,发现了一些有趣的写法。
  这篇文章就分享下这些写法,估计大部分人都不知道:
  提取可选索引的值
  首先,我看到了这样一段类型逻辑:
  图片
  这段逻辑就是取索引类型的 ref 索引的值,但是是通过模式匹配的方式,把提取的类型放到 infer 声明的局部变量 R 里返回的。
  简化一下就是这样的:
  图片
  提取 Props 的 ref 索引的值的类型返回。
  我在想,这么麻烦干什么,直接 Props["ref"] 不就能拿到 ref 索引的值么?
  于是我就改成了这样:
  图片
  然后试了下:
  图片
  不对呀,人家这是可选索引,值的类型是包含 undefined 的联合类型。
  那就 Exclude 下不就行了:
  图片
  这样也比那个 infer 的方式简洁呀,为啥 React 类型定义都是用的 infer 取的可选索引的类型呢?
  后来我突然想到,如果这个 ref 值的类型就是 undefined 呢?
  我试了下:
  图片
  确实,我那样写是有问题的,如果值的类型本来就是 undefined,Exclude 掉 undefined 后就是 never 了,而人家那种方式就没问题:
  图片
  于是我就加一下 undefined 的处理:
  图片
  这样就行了。
  对比了下两种写法:
  图片
  确实还是 React 的那种写法更简洁。
  对了,那上面那层判断呢?
  图片
  这个判断没必要的吧,如果没有 ref,那 Props["ref"] 不就是返回 never 么,没必要单独判断呀?
  然后我就看到了这样一段注释:
  图片
  在 ts 3.0 中,如果索引类型没有对应的索引,那返回的类型是 {} 而不是 never。
  原来如此,这个 "ref" extends keyof Props 是为了做兼容的呀,不是没意义。
  这就是我从这个类型中学到的两个知识点:
  索引访问 Obj[Key] 和 infer 提取和都可以取到索引类型的某个索引的值,但是当处理可选索引的时候,用 infer 更简洁一些,因为前者要取出类型之后再单独处理下 undefined,而后者在 infer 的时候就顺便处理了 undefined。
  ts 3.0 中如果索引类型没有对应的索引,返回的是 {} 不是 never,如果对兼容性要求高的话,可以用 "xx" in keyOf Obj 的方式做下兼容
  我们从这个类型里学到了不少东西,再来看下第二个类型:
  索引类型和 any、never 的处理
  然后我又看到了这样一个类型,
  图片
  先试一下它的功能,传入两个索引类型:
  图片
  看下结果:
  图片
  这是些啥啊,谁能看得懂呀。
  其实这只是因为 TS 没有计算出最终的类型而已,用到的时候才会计算,所以我们可以这样处理下:
  图片
  Copy 的高级类型是通过映射类型的语法构造了一个新的索引类型,它的功能是原封不动的复制一个索引类型。
  类型参数 Obj 约束为索引类型,也就是 Record。key 保持不变,也就是 Key in keyof Obj,value 也保持不变,也就是 Obj[Key]。
  因为重新生成的类型的过程中要做计算,所以那个类型就能提示出最终的结果了:
  图片
  所以说,这个类型的作用是两个索引类型 A,B,只有 A 中有的就保留,A、B 都有的变为可选,B 有但 A 没有的变为可选。
  那这段逻辑具体是怎么用 TS 实现的呢?
  我们先来过一下 TS 这些内置的高级类型:
  Pick
  Pick 的作用是通过映射类型的语法构造一个新的索引类型,根据传入的 Key 对索引做下过滤:
  type Pick = { [P in K]: T[P]; };
  测试下:
  图片
  Partial
  Partial 也是通过映射类型的语法构造一个新的索引类型,但是会把索引变为可选:
  type Partial = { [P in keyof T]?: T[P]; };
  测试下:
  图片
  Extract
  Extract 是取两个联合类型都包含的部分,也就是取交集:
  type Extract = T extends U ? T : never;
  测试下:
  图片
  Exclude
  Exclude 是从联合类型 A 中去掉联合类型 B 中的类型,也就是取差集:
  type Extract = T extends U ? T : never;
  测试下:
  图片
  学会了用 Pick、Partial、Exclude、Extract 这些高级类型,那上面的那段逻辑我们就知道怎么实现了:
  只有 A 中有的就保留的逻辑是:Pick>
  A、B 都有的变为可选:Partial>
  B 中有但 A 中没有的也变为可选:Partial>
  这样,这个类型的主要逻辑我们就理清了:
  图片
  把三部分计算结果的索引类型取交叉类型,就会合并到一起。
  那前面那两个判断是啥?
  P extends any 还有这个 string extends keyof P,这俩都是做啥的?
  P extends any 这个是因为联合类型当作为类型参数出现在条件类型左边时,会把每个类型单独传入做计算,最后把计算结果合并成联合类型,这个特性叫做分布式条件类型。
  比如这样一个联合类型:
  type Union = "a" | "b" | "c";
  我们想把其中的 a 大写,就可以这样写:
  type UppercaseA =
  Item extends "a" ? Uppercase : Item;
  图片
  因为 Item 是类型参数,出现在了条件类型的左边,而且传入的是联合类型,那就触发分发特性,会把每个类型单独传入做计算,然后把结果合并成联合类型。
  所以这里的 P extends any 的作用就是触发联合类型特性的,从而让这个类型能正确处理联合类型。不然联合类型整个传入的话,后面怎么做计算。
  这里的 P extends any 换成 P extends P 也可以,都是一样的作用。
  那后面那段代码 string extends keyof P 是啥意思?
  这个我确实想了一段时间,如果 { a: 1, b: 2} 这样的索引类型,keyof 的结果是 "a" | "b",而如果是数组类型,那 keyof 的结果是 0 | 1 | "length" | "toString" | ...
  什么类型的 keyof 结果是 string 呢?
  突然,我想起了前几天学到的一个知识点:用 keyof any 代替 string | number | symbol 更灵活:
  图片
  而且我试了下 never 的 keyof 结果也是这个:
  图片
  所以说 string extends keyof P 就可以排除 any 和 never 的情况!
  妙呀,还能这么区分 any 和 never。
  所以说,这个类型的逻辑我们已经理清了:
  图片
  这个类型的功能是保留只有 A 有的索引,把 A、B 都有的索引变为可选,把只有 B 有的索引变为可选。
  而且处理了联合类型的情况。
  如果传入的是 any 或者 never,不做处理,直接返回。
  这个类型里我们也学到了不少东西。
  总结
  我看了下 @types/react 的类型定义,学到了不少东西:
  可选索引的值的提取,用 infer 比 Obj[key] 更方便,因为前者只需要 Obj[Key] extends { xxx?: infer Value| undefined}提取 Value 的类型,而后者需要先排除值的类型就是 undefined 的情况,然后再用 Exclude 去掉类型中的 undefined。
  ts 3.0 中取索引类型没有的索引会返回 {} 而不是 never,需要兼容的话可以单独做下判断:"xxx" in keyof Obj。
  处理索引类型可以综合用 Pick、Partial、Exclude、Extract 等内置高级类型对每一部分索引做处理,然后取交叉类型来合并到一起。
  P extends any 和 P extends P 的作用是触发联合类型的分发特性的,加上这段处理才能正确处理联合类型,会把每个类型单独传入做计算,最后把结果合并成联合类型。
  string extends keyof Obj 可以判断出 any 和 never 类型,只有这两种类型取 keyof 的结果是 string | nubmer | symbole,包含 string。
  而且,还讲了一个小技巧:
  ts 类型只有计算的时候才会求值,如果是索引类型,可以用映射类型的语法创建个一摸一样的索引类型,因为用到了,就会做计算,从而就可以显示出最终的类型。
  不得不说,React 类型定义做的挺完善的,考虑到了各种类型的处理,也考虑到了低版本的兼容,从中还是能学到不少东西的。

新能源车取代燃油车需要较长时间本报记者徐蔚冰数据显示,2020年我国新能源汽车产量已经达到145。6万辆,比2019年增长17。3。本次问卷调查中,有观点认为,为促进新能源汽车发展,实现新能源汽车产业发展规划(华为Mate未来手机配备可卷曲显示屏和三合一相机项目专利华为正在开发一款可卷曲的智能手机,其大型拉出式显示屏可覆盖整个正面和大部分背面。华为Mate手机配备可卷曲显示屏和三合一相机华为荣耀华为正在开发一款可卷轴显示的智能手机,它具有巨大如何在Mac上设置自定义锁屏信息?您可以设置一条自定义消息以显示在Mac的锁定屏幕上,这在您放错地方或丢失Mac时非常有用。它让人们一打开Mac就可以看到它属于谁,而且所有权毫无疑问。您需要一个管理员帐户才能在Ma多功能与流畅度兼具,带你重新认识中兴手机系统过去总有些声音说中兴手机的系统UI不怎么样,但经过这几年不断的升级更新,在中兴Axon30屏下版上搭载的MyOS11早已迎来脱胎换骨,实用性和流畅性都有了质的提升。以往媒体时不时就被MIUI不稳定伤透心后,荣耀Magic3Pro短期个人向体验前言如果是在以前,我基本上不会考虑荣耀的手机的,性价比比不过小米,高端比不过华为,尤其在荣耀被华为卖了之后,今年的v40v40轻奢荣耀50都被很多人视为智商机,这种手机我也不会去关开学在即,怎样才能记录学生时代的精彩瞬间?马上就是9月份了,随着开学季的到来,大学生活又要开始新的阶段。不管你是刚刚走进大学校门的菜鸟新人,还是在校园里已经摸爬滚打两三年的老江湖,大学生活都将是充满美好的,在这里能学到更多云服务不用就会回收,魅族这个操作被指太小气大家平常会开启手机的云服务功能吗?相信不少人都跟小编一样,把相册和备忘录开启自动备份云服务,防止被误删除或者换机导致的丢失。但是魅族最近却要收回手机云服务功能,引发不少争议。事情是是个狠人,12256G突降700,联想骁龙888旗舰退场了熟悉联想的朋友都知道,其实相对于小米OV这些传统品牌而言,联想手机面世的时间并不晚,只是因为在综合性手机领域始终没有做出过优秀的成绩,所以联想手机并不怎么出名。不过尽管在手机业务方小伙花30万买三辆特斯拉3,运回自修,面对电池成本时他选择妥协上个月末期河南涌现出很多水泡车,很多年轻人奔赴河南去买车,想捡漏,打算花小钱买到豪华车,为此就有一些小伙子真的掏真金白银买了,图为山东一位小伙花了30万元从郑州买到了三辆特斯拉mo颜值与性价比同存的黑科技运动手表,努比亚红魔手表精钢版HELLO大家好,这里是丁丁科技说,自从AppleWatch登陆市场后,智能佩戴设备的市场可以说是你方唱罢我登场,各大厂都在推出自己的智能手表,三星的GalaxyWatch,华为的红魔6SPro预热能上天的黑科技,散热,再进化日前,据腾讯红魔游戏手机的官方介绍,9月6日1500将会带来一场红魔下半年的新品发布会,会上会出现全新的腾讯红魔游戏手机6SPro。而就在今天,官方对新机也进行了新的预热,称能上天
2000元的骁龙870又多了新选择各位早上好,今天是12月28日,农历十一月廿四。2021年马上就要结束了,各家手机厂商也都开启了火热促销价格优惠,为用户增加了许多新的选择。今天笔者就挑出4款适合购买的骁龙870手智能音箱险酿祸!亚马逊ALEXA指挥十岁小孩挑战硬币插插座近几年来,智能音箱逐渐走入寻常百姓家里,人们的生活也似乎变得有些科幻语音控制开关灯语音查天气无聊的时候可以跟音箱聊天智能音箱是友是敌?在家的日子里,智能音箱变成了人们的好朋友,找不人脸解锁开门新方式VOC智能锁T11FACE使用体验前言近几年来,随着智能技术的加速发展,我们的生活方式也发生了很大的变化,人们对安全的要求也逐渐提升。就拿智能家居来说,越来越多的人会选择用智能门锁,有了它之后,可以解决很多麻烦,比为什么说倪光南最大的成就是拯救了汉字,重新找回了民族自信呢?到现在我才知道我的民族自尊心曾经被弄没过。我使用的汉字曾经被陷入危机。首先汉字输入法在汉卡出现之前就有了,比如大陆的五笔王码,后来与联想打了一场官司,与另一家小公司打赢了,还没有执手机买对不买贵,2022年这三款最值得买,超高性价比买到绝对不亏现在的智能手机市场,发展得越来越快,但是同样的竞争也越来越激烈,相同的处理器不相上下的屏幕素质表现相当的拍照水平差距极其接近的续航。各大智能手机品牌之间的硬实力越拉越近,除去品牌和4K摄影伴侣,同价位最具性价比的雷克沙1800XSD卡作为玩数码的业余摄影玩家,虽然用过的相机种类和数量有限,但搭配这些相机使用的SD卡却已经购买过60张以上,这些SD卡的品牌不同类型不同,容量也从早期的4G提升到了现在的256G,S能远程开电脑的智能插线板3插孔独立分控,助你脱离加班奔波之苦对于二毛这样的上班族来说,领导的命令就是圣旨,无论是工作日还是节假日,总是会冒出来一些急需解决的工作,而这些工作又不能拖到工作日或是第二天完成。而相似的问题想必很多朋友也都遇到过,荣耀危险,Redmi也跑不掉,iPhoneSE3说的!国产手机怎么玩?谁也没想到,过去那么多年了,小米数字旗舰竟然没了高通骁龙旗舰芯片首发权!我也没有想到,过去12月份都是只有小米发布一款产品,今年就变了。从2021年起,国产手机圈的生态和竞争已经变倪光南院士的坚持是对的,华为前车之鉴,小米厚积薄发随着联想事件的不断发酵,力主自研国产芯片系统的倪光南院士当年被柳传志踢出联想一事,让不少网友感到惋惜,要知道这可是中国信息产业快速发展的黄金二十年。如今华为被美国在芯片系统方面的卡FindX5有三款天玑9000骁龙8都有还有折叠屏在本月16日联发科举办的天玑旗舰战略暨新平台发布会上,OPPO正式官宣了将会在新的Find系列上首发搭载天玑9000旗舰处理器,今天,数码闲聊站这边也曝光了Find系列机型的部分产你认为iPhone去掉指纹解锁是不是体验退步?不是指纹和面容始终都是各有千秋的选择只不过苹果不给你选择的机会,苹果也不是只在手机上这么做,MACOS就是典型的我要我觉得,这么多年来一贯如此,看不惯可以不用我本人近10年来一直是