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

真实案例说明TypeScript类型体操的意义

  TypeScript 类型系统支持类型编程,也就是对类型参数做一系列运算产生新的类型。比如这样:
  type isTwo = T extends 2 ? true: false;
  这种类型编程逻辑可以写的很复杂,所以被戏称为"类型体操"。
  它是 TS 中最强大也是最复杂的部分了,属于深水区的内容。
  很多同学不知道类型编程学了有什么用,好像做业务也用不到这个。那今天我们就来看一个具体的例子,来感受下类型体操的意义。
  我们想实现这样一个 JS 方法:
  function parseQueryString(queryStr) {
  if (!queryStr || !queryStr.length) {
  return {};
  }
  const queryObj = {};
  const items = queryStr.split("&");
  items.forEach(item => {
  const [key, value] = item.split("=");
  if (queryObj[key]) {
  if(Array.isArray(queryObj[key])) {
  queryObj[key].push(value);
  } else {
  queryObj[key] = [queryObj[key], value]
  }
  } else {
  queryObj[key] = value;
  }
  });
  return queryObj;
  }
  这段代码很容易看出来就是做 query string 的 parse 的,会把 "a=1&b=2&c=3" 的字符串 parse 成 { a: 1, b: 2, c: 3 } 返回。如果有同名的 key 的话,就合并到一个数组里。
  JS 的逻辑大家写的比较多,这部分很容易理解:
  图片
  那如果要给这个函数加上类型,大家会怎么加呢?
  我猜,大部分人会这么加:
  图片
  参数是 string 类型,返回值是 parse 之后的对象类型 object。
  这样是可以的,而且 object 还可以写成 Record,因为对象是索引类型(索引类型就是聚合多个元素的类型,比如对象、class、数组都是)。
  图片
  Record 是 TS 内置的一个高级类型,是通过映射类型的语法来生成索引类型的:
  type Record = {
  [P in K]: T;
  }
  比如传入 "a" | "b" 作为 key,1 作为 value,就可以生成这样索引类型:
  图片
  所以这里的 Record 也就是 key 为 string 类型,value 为任意类型的索引类型,可以代替 object 来用,更加语义化一点:
  图片
  但是不管是返回值类型为 object 还是 Record 都存在一个问题:返回的对象不能提示出有哪些属性:
  图片
  对于习惯了 ts 的提示的同学来说,没有提示太不爽了。怎么能让这个函数的返回的类型有提示呢?
  这就要用到类型编程了。
  我们把函数的类型定义改成这样:
  图片
  声明一个类型参数 Str,约束为 string 类型,函数参数的类型指定是这个 Str,返回值的类型通过对 Str 做类型运算得到,也就是 ParseQueryString。
  这个 ParseQueryString 的类型做的事情就是把传入的 Str 通过各种类型运算产生对应的索引类型。
  这样返回的类型就有提示了:
  图片
  是不是很神奇!这就是类型体操的魅力!能够实现更精准的类型提示。
  那这个 ParseQueryString 的高级类型是怎么实现的呢?
  其实我们实现过:TS 类型体操:图解一个复杂高级类型,这里再讲一下:
  首先我们要把 "a=1&b=2&c=3" 的字符串按照 & 分割开,使用模式匹配的方式。
  把提取出来的每一个 a=1、b=2、c=3 这种字符串再做一次处理,把结果合并起来返回。
  也就是:
  type ParseQueryString
  = Str extends `${infer Param}&${infer Rest}`
  ? MergeParams, ParseQueryString>
  : ParseParam;
  类型参数 Str 为待处理的字符串类型,通过模式匹配的方式提取 & 分割的字符串到 infer 声明的局部变量 Param 中,剩下的放到 infer 声明的局部变量 Rest 中。
  对提取出来的 Param 再做处理,也就是 ParseParam,剩下的递归处理,也就是 ParseQueryString,然后把结果合并。
  如果模式匹配不满足,就说明没有 & 了,那就把剩下的也做一次处理返回。
  这里的 ParseParam 就是处理 a=1、b=2、c=3 这种字符串的,也是通过模式匹配来提取:
  type ParseParam =
  Param extends `${infer Key}=${infer Value}`
  ? {
  [K in Key]: Value
  } : Record;
  类型参数 Param 是待处理的字符串,通过模式匹配提取 = 分隔的字符串到局部变量 Key 和 Value 中,构造成索引类型返回,
  如果模式匹配不满足,说明不是 = 分隔的字符串字面量类型,就返回 Record 代表任意索引类型。
  图片
  测试下:
  图片
  然后对多个索引类型的合并,就是通过映射类型的语法构造一个新的索引类型:
  type MergeParams<
  OneParam extends Record,
  OtherParam extends Record
  > = {
  readonly [Key in keyof OneParam | keyof OtherParam]:
  Key extends keyof OneParam
  ? Key extends keyof OtherParam
  ? MergeValues
  : OneParam[Key]
  : Key extends keyof OtherParam
  ? OtherParam[Key]
  : never
  }
  类型参数 OneParam 和 OtherParam 是两个索引类型,通过 Record 来约束。
  通过映射类型的语法构造一个新的索引类型返回,Key 来自两者的合并,也就是 Key in keyof OneParam | keyof OtherParam。并且加上一个 readonly 的修饰,这样就是让返回的索引类型不能被修改。
  值要判断下如果是两者都有的值,那就做合并,否则分别取对应的值。
  合并的逻辑是这样的:
  type MergeValues =
  One extends Other
  ? One
  : Other extends unknown[]
  ? [One, ...Other]
  : [One, Other];
  类型参数 One、Other 为待合并的两个值的类型,如果两个一样就返回其中一个,否则如果是数组就合并数组,也就是 [One, ...Other],否则把两个值合并成数组 [One, Other]。
  这样就完成了两个索引类型的合并,测试下:
  图片
  整体测试下:
  图片
  成功了!我们实现了 ParseQueryString 的高级类型!(如果对类型体操看不明白的话,可以去看下我的小册《TypeScript 类型体操通关秘籍》补下基础)
  当然,这只是纯粹的类型体操,把它用到 JS 里才是最终目的,所以我们把 parseQueryString 的类型定义改成了这样:
  图片
  把函数参数的类型传入 ParseQueryString 的高级类型做类型运算,返回的结果作为函数返回值的类型。(这里要用 as any 把返回值断言为 any,因为默认推导的类型不精确,我们用根据 Str 动态算出来的类型)
  这样也就能实现精准的类型提示:
  图片
  并且因为我们 readonly 的限制,不能修改属性的值:
  图片
  对比下没用类型体操的时候:
  图片
  就可以得出结论:
  类型编程可以通过类型运算产生更准确的类型,配合编辑器可以做更精准的类型提示和检查,这就是类型体操的意义。
  总结
  类型编程是 TypeScript 的深水区内容,它是对类型做一系列类型运算后产生新的类型,它可以实现更精准的类型提示和检查。
  我们通过 parseQueryString 这个函数的类型定义来直观感受了下用类型体操和不用类型体操的区别,在类型提示这方面,体验是相差很多的。
  实现更精准的类型提示和检查,这就是类型体操的意义!

支付工具向支付平台的进化几乎所有的平台产品也都是从工具做起的,很多工具型公司或者内容公司都有成为平台公司的冲动,它们有些路径是共通的先利用工具建立自身和某个参与方的关系。定位从工具调整到链接随后,引入第二一月开门红燃起虎年车市雄心来源经济参考报吴蔚近期各大车企纷纷公布了1月份销量数据,开门红成了频率最高的措辞。事实上,受春节放假及上一年12月份厂商冲量因素叠加影响,1月份通常为车市销售淡季,但今年车市淡季不iPhoneSE3上市迫近供应商称配置将有大幅升级安卓与iOS对垒加剧科创板日报(上海,编辑王古锋)讯,3月8日苹果春季发布会即将到来,而iPhone新款手机的预热也已经到来。近日,据媒体报道,在这一场发布会中,新一代的iPhoneSE3也将登场亮相北斗导航打造冬奥智慧公路通信1人民日报推动5G应用规模化发展人民日报刊发时评文章称,5G应用,正在成为赋能千行百业加速数字化转型的重要驱动力。无论是从投资有效性角度,还是从加速发挥新动能引擎来看,以建促用跨境电商综试区扩容广东路径从先行探索到全覆盖,转型建设全球贸易数字化领航区南方财经全媒体记者柳宁馨广州报道日前,国务院批复同意在27个城市和地区设立跨境电子商务综合试验区(下称跨境电商综试区)。广东省韶关市汕尾市河源市阳江市清远市潮州市揭阳市云浮市8市入如何用电脑无线读取手机文件,几步操作完美搞定,免费高速无限制朋友想象一下这么一个场景,你要拷贝手机的文件到电脑。结果数据线没带,咋整?今天我就教大家无线读写手机的文件,免费高速不耗费你的流量,还不限制文件传输大小,断网也能用!第一步下载FT从智能电视应用内没有电视台直播软件说起我家的智能电视机购于2017年。以前一直以为看电视电影要付费,看电视台直播要有线电视或网络机顶盒。今年作了深入了解,明白了其中很多道理。智能电视机是一场视听领域的革命,改变了游戏规比小米更强,让库克绝望,realme新机创下新纪录大家都知道,在电竞手机领域内有三个广受认可的品牌,分别是黑鲨红魔和ROG。这三个品牌不管是产品迭代还是技术沉淀都已经是电竞界的三座大山了。除了上述的三个稳稳的一线,还有联想拯救者r手机NFC门禁卡,再也不担心门禁卡找不到了NFC是NearFieldCommunication缩写,即近距离无线通讯技术。许多手机厂商支持NFC技术,通常在手机钱包App内,而且门禁读头也都越来越多支持NFC的读取。利用N内置4500mAh电池三星S22来袭,三星S21跌至大米价,上演砸场闹剧AI影像功能记录每刻精彩三星S22大杯机型还内置了4500mAh,AI影像功能记录每刻精彩三星S22大杯机型以及升级了快充,AI影像功能记录每刻精彩三星S22大杯机型来到了45W,你惨啦!看完这六个tips,你就会爱上moto手机系统什么样的手机才是好手机?光有强大的硬件可不够,各方面体验一定要跟上,才能让用户准确感知到手机的好用实用。换句话说,别总整那些纸面参数的活儿,把最贴近生活的细节功能设计带给消费者才O
国产手机已领跑屏下摄像技术?从三星和中兴的对比,真找到答案2018年,是真全面屏搅动风云的一个重要时间。在当时,vivo发布了升降式摄像头设计,真正将摄像头消灭,让正面设计只留下屏幕,屏占比高达90以上,一举成为了全球最高屏占比的手机,受9款嵌入式烤箱测评,哪款噪音最小,烘烤效果谁最好?以前,看美食教学视频弹幕总是飘过学会了,烤箱哪里领现在,看美食教学视频弹幕变成了烤箱有,手在哪里领在消费升级的大趋势下伴随着新式厨房概念的普及烤箱已成为了中国消费者的厨房新宠为引导滴滴出行从简陋的车库到千亿帝国的铸成,再到纳斯达克的狂欢美国东部时间6月30日,滴滴正式在纽交所挂牌上市。滴滴开盘价18美元,市值一度超过800亿美元(约合5166亿人民币)。与其他公司敲钟鸣锣的热闹仪式截然相反,滴滴上市显得格外低调,金立手机重出江湖!采用类似红米的设计,这是要走性价比路线?日前,一款型号为GNS2112Y的新金立手机通过了TENAA的认证。该清单包含有关其规格和设计的所有信息。有趣的是,可以看到GNS2112Y手机的设计类似于小米的RedmiNote京东手机未来终极10问帮助行业转型升级为探询手机的技术发展方向,京东手机通讯联合第一财经日报发起手机未来终极10问,联动小米realme中兴vivo联想魅族OPPO一加等主流手机品牌大佬参与,一起展开了一场别开生面的讨使用手机的不良习惯,你占了几条?手机支付的防骗技巧点进来看!手机功能越来越强大了手机支付也越来越方便了正确使用它像块宝不正确使用也会带来烦恼最痛苦的事是手机还在隐私和钱没了!资金被盗刷的报道比比皆是我们要如何避免这些安全隐患发生?接下来为大七彩虹PCIe4。0显卡延长线有惊喜大规模散热器会导致显卡过重,装在机箱里面时间久了就容易出现压弯显卡PCB的情况,进而造成PCB板上的元件松动接触不良,甚至PCB板本身发生弯曲损坏。为了解决这个问题,很多机箱厂商会没让国人失望的比亚迪,配中文按键车标,续航520公里14。99万起随着越发多的新能源车型到来和充电桩的不断普及,如今考虑家用代步车的消费者,不少都开始关注起了电车。因为从用车成本上,电车在后续确实比燃油车便宜不少再到通勤便利上,电车不限号一线城市实时传输协议RTP(一)实时传输协议RealtimeTransportProtocol(RTP)。实时传输控制协议RealtimeTransportControlProtocol(RTCP)。RFC文档为16万元的特斯拉Model2上市在即蔚小理们还扛得住吗?近日,经过特斯拉中国区运营总裁TomZhu确认,特斯拉正在开发一款低成本的电动车车型。同时,该车型将在中国设计工程和制造,并进行相关测试,由特斯拉中国工程团队来负责。该车将不仅是中特斯拉的遮羞布被一张照片掀开,暴雨天外面下大雨,车里面下小雨前段时间据官方统计,我国汽车已经达到了2。6亿辆,由于我国汽车基数太大,汽车的尾气排放也不再是一个小问题,自从国6政策出来,很多车主都比较担忧哪天突然出个国7把自己车子个淘汰了,毕