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

从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 类型定义做的挺完善的,考虑到了各种类型的处理,也考虑到了低版本的兼容,从中还是能学到不少东西的。

香港低调富豪站在苹果公司身后,大赚420亿财富香港神秘富豪站在苹果公司身后,大赚420亿财富推荐语信息化时代的来临,当下人们最离不开的,莫过于智能手机了。大家不妨可以想象一下,如果我们生活中没有了手机,将会变成什么样子?简直想新基建全面提速,5G边缘计算如何乘风破浪?新基建已经成为我国的经济与科技热词,备受关注。相对于传统基建而言,新基建主要指以数字经济和人工智能为主要业态的新兴领域,包括5G基建工业互联网大数据中心人工智能等。尤其是5G,在新智慧工地搭上新基建风口,EasyGBS如何成为市场香饽饽?随着科技高速发展,视频信号经过数字压缩,通过互联网宽带或者移动3G4G网络传递,可实现远程视频监控功能。将这一功能运用于施工现场安全管理,势必会大大提高管理效率,提升监管层次。需求天秀!6。6万买哈弗M6,超值家用SUV不是ampampquot盖ampampquot的!有人说,买车就像做判断题,在众多车型中一项一项对比,才能pick出最适合自己的车。但做判断题实在太麻烦,需要花费购车者大量的时间精力去做攻略。所以,今天小编就为大家介绍一款超值家用帝瓦雷技术加持HiFi级智能音箱,华为SoundX正式发布11月25日,华为MatePad及全场景新品发布会在上海U时尚艺术中心隆重举行。活动现场,全球首款震撼双低音HiFi智能音箱华为SoundX正式发布,产品售价1999元。作为华为与多年果粉终于出坑,用过华为Mate20后无法自拔苹果近几年的创新乏力有目共睹,在库克的领导下,产品力原地踏步,售价却是蹭蹭的涨,但很多老果粉还是硬着头皮上了,结果则是越来越失望。特别是去年发布的三款iPhoneXS系列,因为苹果谁说女人只在意副驾?做欧拉女神,hold住人生方向盘副驾驶对于女人来说一直是个敏感的位置。在微博上,经常能看到网友吐槽男朋友的副驾坐了别的女人,即使是大明星也会公开喊话我老公的副驾只能我坐。女人对于副驾的捍卫,实际上是在表明此车和开你值得更好的,特别是在买电视这件事情上不难发现,电视产品的两极分化已经达到了空前的极端化,下至几百元,上至几十万。这跟市场需求有密不可分的关系,但也跟整机厂商的产品导向息息相关。粗看可分为两派一派追求更好的显示效果,更发力中端!三星A8s真机图赏三星针对国内市场的急剧变化,迅速做出了调整,A系列先是推出了首款后置四摄手机A92018,随后不久又推出了首款首款黑瞳全视屏手机A8s,也就是网友们戏称的挖孔屏,作为全面屏的最新解称微信市场份额超过支付宝的益普索是何方神圣?被民调光速打脸最近全球知名市场研究机构益普索发布的2019年Q1最新数据显示,微信市场份额已经领先支付宝达到51,支付宝市场份额仅为41。可是这一数据却被微博上一项民调光速打脸。有媒体在微博上发心动好价再度来袭TheNewP30Pro成秋冬时尚新趋势在最近几次时装周所衍生出的众多时尚元素里,经过了时间的考验和筛选,还有哪些依旧被看好?相信关注时尚动向的你也一样好奇,已经到来的2019年秋冬穿搭,玩什么新花样才好看高级又与众不同
vivo手机超实用的5个小技巧,别说你一个都不知道今天vivo小课堂来跟大家介绍几个vivo手机使用中的小技巧,一起来看看日常你有没有发现他们的妙用呢?屏幕固定可以通过后台多任务卡片上方的,找到它,屏幕固定后,手机会锁定在当前AP最伤手机的4个坏习惯,99的人都有正文前发问现在这个手机,是你的第几部手机前几部手机是因为什么原因淘汰的呢对于频繁更换爱机的人来说一般是因为手机配不上现在的我而对于大多数人来说当手机使用寿命即将耗尽的时候才会选择换vivo宁夏携手哈雷摩托!穿越塞上丝路,开启霸气之旅哈雷摩托的世界,是追求自由的世界,选择一辆哈雷,就是给自己追求生活理念的一个机会。在你骑上哈雷的那一瞬间,发动机连接着你的脉搏,声音来自你的心脏。上个周末vivo宁夏携手哈雷摩托骑联发科2021年第一季度财报业绩抢眼,5G业务大幅增长近日,联发科公布了2021年第一季度财报,第一季度营收达到了1080亿新台币(约251亿人民币),超过了原本的目标范围,环比上涨12。1,同比增长77。5。联发科第一季度能够取得如一加9是直屏幕吗?看来刘作虎还需要加油近日网上冲浪看到一个问题一加9是直屏幕吗,作为半个数码行业从业者业余编辑,看到这个问题还是觉得蛮有意思的。其一,类似关于一加手机的提问越来越多证明这个过去小而美的手机品牌终于引起了安卓之光之名坐实!小米11Ultra喜迎13项相机优化小米11Pro与小米11Ultra号称是安卓之光,现在来看还真的是名副其实的事情了。据悉,这两款手机实现了DXOMARK相机固件升级,MIUI版本号为12。5。4。0,实现了13项36个月不卡!OPPOReno6荣获泰尔测评证书,外观影像值得期待近日,OPPOReno6系列正式通过了中国泰尔实验室颁发对老化前后的应用冷启动应用热启动应用安装时间相机性能开机时间测试,测试结果显示其能够连续使用36个月。这表明OPPOReno能得到带货女王薇娅多次选品,努比亚氮化镓充电器到底有多强?说起直播带货,很多人相比和我一样第一个想到的就是薇娅了,随着近两年直播带货持续走热,各种优质好物都能卖出量来。这背后与薇娅始终坚持的两个原则密不可分,分别是选品的质量必须过关和粉丝男子因色弱不能考驾照被分手,OPPO为特殊人群制造有色眼镜相关数据显示在中国大约有8000万色盲色弱人群,这基本是因为基因缺陷造成的,虽然平时对正常生活影响不大,但是在选择大学专业考驾照等很多时候往往会受到很多限制。近日来自1818黄金眼追上恒大,超过融创!小米凭什么可以排名福布斯第222位?背景5月13日公布的福布斯全球上市公司2000强榜单中,小米仅用一年的时间就上升了162位,目前排名为222位这个骄人的成绩,使得小米超过了227位的中国恒大,及230位的融创中国警事咨询中的问题及答案(第四季)1。您好,因为学习驾驶证明的有效期只有3年,我之前一直在国外工作,距离当初科目一合格已经隔了很长时间,今年年前回到国内,本来想继续学习,但因为疫情防控的原因没办法继续学习,现在马上