最新要闻
- 信息:2022年跨境电商市场规模15.7万亿元
- 【环球时快讯】6499元买吗?雷军晒小米13 Ultra限量定制色真机上手图:网友大呼背刺
- 家用强力灭蚊!雅格充电电蚊拍10.9元起狂促_报资讯
- 世界聚焦:“五一”假期日均125.3万人次出入境
- 奈雪五一小长假订单同比上涨120% 部分门店涨幅超800%|热资讯
- 【天天热闻】五一18人预付9600元订民宿遭毁约!青岛市监局立案调查
- 环球视讯!4月百城二手住宅价格跌幅扩大:挂牌量持续走高 房价走势承压
- 环球快资讯丨来了乌鲁木齐,相当于去了中东石油富豪区消费?
- 全面看齐新7系!宝马新一代5系G60外观、内饰首度公开亮相:发光双肾抢眼-全球速讯
- 门密码锁怎么加入指纹?第一次使用记住这4点 环球讯息
- 博安生物(6955.HK):地舒单抗注射液国际3期临床试验完成首例受试者入组|今日视点
- 纤薄身材也能满血发挥!耕升RTX 4070踏雪评测:2K游戏通吃的高颜值显卡 环球关注
- 购燃油车就送粤A蓝牌!广汽集团在广州推限时购车补贴
- 看不下去AI胡说八道 英伟达出手给大模型安了个“护栏”
- 世界通讯!鼠目寸光是什么生肖_鼠目寸光的意思及造句
- 2023山东东营市广饶县事业单位招聘面试通知书领取通知
广告
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
TypeScript 学习笔记 — 模板字符串和类型体操(十五) 当前头条
(资料图片仅供参考)
目录- 基本介绍
- 字符串类型体操实操环节
- 1. 字符串首字母大写 CapitalizeString
- 2. 获取字符串第一个字符 FirstChar
- 3. 获取字符串最后一个字符 LastChar
- 4. 字符串转元组 StringToTuple
- 5. 元组转字符串 TupleToString
- 6. 重复字符串 RepeatString
- 7. 字符串分割 SplitString
- 8. 获取字符串长度 LengthOfString
- 9. 驼峰转为短横线隔开式 KebabCase
- 10. 短横线隔开式转为驼峰 CamelCase
- 11. 字符串是否包含某个字符 Include
- 12. 去掉左右空格 Trim
- 13. 字符串替换 Replace
- 14. 函数重命名改变返回值类型 ComponentEmitsType
基本介绍
TS 中模板字符串类型 与 JS 模板字符串非常类似,,通过 ${}
包裹,
- 模板字符串类型的目的就是将多个字符串组装在一起
type name = "Echoyya";type sayHaha = `hi ${name} haha`; // type name = "Echoyya";
- 模板字符串具备分发的机制可以组成联合类型实现:marign-left、 margin-top、 margin-bottom.....
type Direction = "left" | "right" | "top" | "bottom";type size = "10" | "20";type AllMargin = `margin-${Direction}:${size}px;`;
- 在映射类型中使用模板字符串
对象属性重命名
type Person = { name: string; age: number; address: string };// 全部重命名type RenamePerson = { [K in keyof T as `rename_${K & string}`]: T[K];};// 仅为指定的key重命名type RenamePersonForKey = { [K in keyof T as K extends X ? `rename_${K & string}` : K]: T[K];};type a1 = RenamePerson; // rename_name, rename_age, rename_addresstype a2 = RenamePersonForKey; // rename_name,age,address
针对模板字符串内部还提供了很多专门的类型,可以供我们使用 Uppercase 转大写
、Lowercase转小写
、Capitalize首字母大写
、Uncaptailize首字母小写
使用模板字符串和内置的类型,实现为对象类型统一生成对象属性的 getter / setter 等方法
type Person = { name: string; age: number; address: string };type PersonGetter = { [K in keyof T as `get${Capitalize}`]: () => T[K];};let person!: PersonGetter;person.getName();person.getAge();person.getAddress();
Emits 方法的封装实现:{ onA: () => {}; onB: () => {}; onC: () => {} }
type Events = { a: () => {}; b: () => {}; c: () => {} };type EmitsGetter = { [K in keyof T as `on${Capitalize}`]: T[K];};type EmitsEvents = EmitsGetter;
模板字符串配合 infer 使用和元组的 infer 用法很相似 [infer L,...infer R]
,L 是第一个,又有点像正则的匹配模式
type getFirstWord = S extends `${infer L} ${string}` ? L : any;type FirstWord = getFirstWord<"hello world">; // type FirstWord = "hello"
字符串类型体操实操环节
TS 通过 type 声明的类型,如果设置了泛型,也就是类型参数,就是高级类型。高级类型的目的是通过一系列类型运算来生成更准确的类型。这种生成不同类型的高级类型的生成逻辑,就是所谓的类型体操
。
1. 字符串首字母大写 CapitalizeString
export type CapitalizeString = T extends string ? `${Capitalize}` : T;type a1 = CapitalizeString<"handler">; // Handlertype a2 = CapitalizeString<"echoyya">; // Echoyyatype a3 = CapitalizeString<233>; // 233
2. 获取字符串第一个字符 FirstChar
export type FirstChar = T extends `${infer L}${infer R}` ? L : never;type A = FirstChar<"BFE">; // "B"type B = FirstChar<"Echoyya">; // "d"type C = FirstChar<"">; // never
3. 获取字符串最后一个字符 LastChar
export type LastChar = T extends `${infer L}${infer R}` ? LastChar : F;type A = LastChar<"BFE">; // Etype B = LastChar<"Echoyya">; // atype C = LastChar<"a">; // a
4. 字符串转元组 StringToTuple
export type StringToTuple = T extends `${infer L}${infer R}` ? StringToTuple : F;type A = StringToTuple<"Echoyya">; // ["E", "c", "h", "o", "y", "y", "a"]type B = StringToTuple<"">; // []
5. 元组转字符串 TupleToString
export type TupleToString = T extends [infer L, ...infer R] ? TupleToString // 模板字符串拼接 : F;type A = TupleToString<["E", "c", "h", "o"]>; // Echotype B = TupleToString<["a"]>; // atype C = TupleToString<[]>; // ""
6. 重复字符串 RepeatString
export type RepeatString< T extends string, C, // 重复次数 A extends any[] = [], // 拼接Arr F extends string = "" // 最终结果> = C extends A["length"] // Arr长度是否满足重复C ? F : RepeatString;type A = RepeatString<"a", 3>; // "aaa"type B = RepeatString<"a", 0>; // ""
7. 字符串分割 SplitString
type SplitString< T extends string, S extends string, // 分割符 F extends any[] = [] // 最终结果> = T extends `${infer L}${S}${infer R}` // infer 匹配模式 ? SplitString : [...F, T]; // 最后一次不满足条件时,需要将最后一个单词也放入结果集中type A1 = SplitString<"handle-open-flag", "-">; // ["handle", "open", "flag"]type A2 = SplitString<"flag", "-">; // ["flag"]type A3 = SplitString<"handle.open.flag", ".">; // ["handle", "open", "flag"]type A4 = SplitString<"open.flag", "-">; // ["open.flag"]
8. 获取字符串长度 LengthOfString
type LengthOfString = T extends `${infer L}${infer R}` ? LengthOfString : F["length"];type A = LengthOfString<"Echoyya">; // 7type B = LengthOfString<"">; // 0
9. 驼峰转为短横线隔开式 KebabCase
type KebabCase = T extends `${infer L}${infer R}` ? KebabCase extends L ? `-${Lowercase}` : L}`> // 取每个字母判断 是否与其大写一致,拼接短横线并转为小写 : RemoveFirst; // 当第一个字母也是大写时会多一个-,需要截取调type RemoveFirst = T extends `${infer L}${infer R}` ? R : T;type a1 = KebabCase<"HandleOpenFlag">; // handle-open-flagtype a2 = KebabCase<"EchoYya">; // echo-yya
10. 短横线隔开式转为驼峰 CamelCase
type CamelCase = T extends `${infer L}-${infer R1}${infer R2}` ? CamelCase}`> // 递归R2,去掉-,拼接大写的R1 : Capitalize<`${F}${T}`>; // 结果首字母也需要大写type a1 = CamelCase<"handle-open-flag">; // HandleOpenFlagtype a2 = CamelCase<"echo-yya">; // EchoYya
11. 字符串是否包含某个字符 Include
type Include = T extends "" ? C extends "" ? true : false // 空字符串时需要特殊处理 : T extends `${infer L}${C}${infer R}` ? true : false;type a1 = Include<"Echoyya", "E">; // truetype a2 = Include<"Echoyya", "o">; // truetype a3 = Include<"", "">; // true 空字符串时需要特殊处理type a4 = Include<"", "a">;
12. 去掉左右空格 Trim
type TrimLeft = T extends ` ${infer R}` ? TrimLeft : T;type TrimRight = T extends `${infer L} ` ? TrimRight : T;type Trim = TrimLeft>;type a1 = Trim<" Echoyya ">; // Echoyya
13. 字符串替换 Replace
type Replace = // 空格替换 特殊处理 C extends "" ? T extends "" ? RC : `${RC}${T}` : T extends `${infer L}${C}${infer R}` // 匹配模式 ? Replace // 结果拼接并替换 : `${F}${T}`;type a1 = Replace<"ha ha ha 123", "ha", "he">; // he he he 123type a2 = Replace<"Ey", "Ey", "Echoyya">; //Echoyyatype a4 = Replace<"", "", "Echo">; //Echotype a3 = Replace<"a", "", "yya">; //yyaa
14. 函数重命名改变返回值类型 ComponentEmitsType
// 转化为/* { onHandleOpen?: (flag: boolean) => void, onPreviewItem?: (data: { item: any, index: number }) => void, onCloseItem?: (data: { item: any, index: number }) => void, } */type a1 = { "handle-open": (flag: boolean) => true; "preview-item": (data: { item: any; index: number }) => true; "close-item": (data: { item: any; index: number }) => true;};type CamelCase = T extends `${infer L}-${infer R1}${infer R2}` ? CamelCase}`> // 递归R2,去掉-,拼接大写的R1 : Capitalize<`${F}${T}`>; // 结果首字母也需要大写type ComponentEmitsType = { [K in keyof T as `on${CamelCase}`]: T[K] extends (...args: infer P) => any // 参数类型不变 ? (...args: P) => void // 仅改变返回值类型 : T[K];};type a2 = ComponentEmitsType;
关键词:
-
在Zynq平台上使用uCOS [原创www.cnblogs.com/helesheng]-天天热文
介绍了在Zynq-7000的PS部分使用uCOS操作系统的方法与步骤,并提供了一些常见问题的解决思路。
来源: TypeScript 学习笔记 — 模板字符串和类型体操(十五) 当前头条
天天日报丨(转载)性能测试应该怎么做?
在Zynq平台上使用uCOS [原创www.cnblogs.com/helesheng]-天天热文
ChatExcel?|焦点信息
全球讯息:【手记】翻新显卡安装驱动程序
信息:2022年跨境电商市场规模15.7万亿元
【新华500】新华500指数(989001)4日收涨0.05% 环球即时
新华社权威快报丨2023年“五一”假期全国营业性客运量合计26971.6万人次
【环球时快讯】6499元买吗?雷军晒小米13 Ultra限量定制色真机上手图:网友大呼背刺
家用强力灭蚊!雅格充电电蚊拍10.9元起狂促_报资讯
世界聚焦:“五一”假期日均125.3万人次出入境
报道:我设计了个【方案】:比redis好10倍的kv库【一统kv】
Apache Pulsar 在火山引擎 EMR 的集成与场景
PA 2022 部分题解_环球热门
ios app真机测试到上架App Store详细教程-必看 快播
奈雪五一小长假订单同比上涨120% 部分门店涨幅超800%|热资讯
【天天热闻】五一18人预付9600元订民宿遭毁约!青岛市监局立案调查
环球视讯!4月百城二手住宅价格跌幅扩大:挂牌量持续走高 房价走势承压
Hadoop运行集群搭建-世界速读
golang基础知识 环球快讯
聚焦:用手机号码归属地 API 开发的应用推荐
环球快资讯丨来了乌鲁木齐,相当于去了中东石油富豪区消费?
全面看齐新7系!宝马新一代5系G60外观、内饰首度公开亮相:发光双肾抢眼-全球速讯
门密码锁怎么加入指纹?第一次使用记住这4点 环球讯息
让Visual Studio用上chatgpt
【解决方法】白嫖利用WPS自带C盘清理大师,清理C盘空间,自测清理19.5G空间,太感人了! 当前快播
Linux安装部署Redis(超级详细)-全球看热讯
博安生物(6955.HK):地舒单抗注射液国际3期临床试验完成首例受试者入组|今日视点
纤薄身材也能满血发挥!耕升RTX 4070踏雪评测:2K游戏通吃的高颜值显卡 环球关注
购燃油车就送粤A蓝牌!广汽集团在广州推限时购车补贴
看不下去AI胡说八道 英伟达出手给大模型安了个“护栏”
世界通讯!鼠目寸光是什么生肖_鼠目寸光的意思及造句
世界微资讯!热门的常用 API 大全分享
观速讯丨Spring AOP官方文档学习笔记(三)之基于xml的Spring AOP
播报:常见未授权访问漏洞汇总
每日播报!AD主辅域控切换-辅域控制器升级为主域控制器-详细操作
Excel文件根据自定义模板生成标签或数据报表
2023山东东营市广饶县事业单位招聘面试通知书领取通知
u18包括18岁吗?足球比赛中的u系列是什么意思?
英雄联盟150位英雄名字是什么?2022lpl夏季赛赛程表
iphone手机看电子书能用什么格式?iphone电子书APP推荐
NBA 2K14存档文件在哪里?nba2k14电脑版键盘操作
十全食美多种零食 奥利奥大礼包39元1.6斤再发车
不涨价!小米13 Ultra限量定制色上架:16+512GB售价6499元
仙气飘飘 洛阳90后女生穿汉服开公交:展示传统文化之美
观察:发布整整10年后:第一代iPad Air被正式抛弃
刺客信条系列中哪个最好玩?刺客信条奥德赛选男还是女?
阿迪达斯官网买的产品是正品吗?阿迪达斯和耐克是什么关系?
承重墙允许开洞最大尺寸是多少?承重墙拆了要承担什么责任?
安陵容知道是宝鹃害她的吗?甄嬛传当年火到什么程度?
广交会里的“大食物观” 食品企业坚持科技创新|全球今日报
只种一颗杨梅树会结果吗?宏宝莱杨梅冰多少钱一袋?
怎么改蚂蚁庄园小鸡的名字?蚂蚁森林如何修改自己的昵称?
天天微速讯:学系统集成项目管理工程师(中项)系列17a_范围管理(上)
使用python查看五黄及罗猴
世界百事通!【访问者设计模式详解】C/Java/JS/Go/Python/TS不同语言实现
THE PLANETS MERCURY -环境变量的设置提权以及SETENV的理解
嵌入式测试手册——基于NXP iMX6ULL开发板(2)
gta4热咖啡补丁下载_GTA4热咖啡
京口法院微电影把诈骗“演”给你看|世界热门
五一假期返程现特种兵式学习:小学生高铁小桌板上疯狂赶作业
1盒不到3元!特仑苏全脂/低脂牛奶大促:高蛋白 易吸收
世界简讯:AMD正式发布锐龙7040U APU:最先进4nm Zen4、15W超低功耗
“非洲狮的好朋狗”?动物园回应圈养鸡羊狗:珍稀品种 非普通家禽|每日观点
320.37万人次,42.32亿元!海南“五一”旅游成绩单出炉 今日热文
观热点:第1章 大数据概述
世界热点评!内网穿透
工控机中部署Ubuntu 22.04 系统
【财经分析】贝泰妮高增长不再 股价跌去六成后能否再出发?
全球热点评!众智科技:4月28日获融资买入89.58万元,占当日流入资金比例19.76%
特斯拉中国突然涨价 销售催“等等党”赶紧下单:早买车就是赚到
路人如何衡量汽车品牌营销费用高低?李想支了一招:看留言-天天速讯
止渴解腻夏日必备!果舒拉桂花酸梅晶好价:3盒券后29.9
男子在西湖捞手机日入约一万!官方回应:不是景区工作人员
热火老将乐福本赛季中期从骑士买断加盟
襄阳市市场监管局开展“你点襄检”专项执法行动_全球头条
【国际大宗商品早报】经济衰退前景打压国际油价大幅下挫4% 美麦涨超5% 当前关注
中国影史第三!今年五一档电影总票房超15亿元
【天天播资讯】40系显卡3大优势!再买30系就冤了
世界热议:喂到嘴边的肥肉!新势力无奈破产:富士康喜提造车工厂一座
阿里云:亏了13年刚赚钱 为啥被逼着五折大促销?
世界热资讯!916万人次假期逛郑州 尽享“文化味”“烟火气”
通过Python进行MySQL表信息统计
互联网鬼城!AI专属社交平台爆火:人类只能看不能说_全球最新
小米13 Ultra白色16GB+1 TB版今日首发:7299元
成交单价突破42万元 比亚迪:腾势D9连续4个月30万元以上新能源MPV第一
中远海发(02866.HK):5月3日南向资金减持98.5万股
芍药坦荡荡
云原生底座之上,这些企业领跑行业的秘密
二、高级语言语法描述
降价9万后雪铁龙C6销量暴涨!总经理:价格战对品牌有伤害
环球今日报丨李想怒怼车评媒体人:不投放你 就是因为你太爱煽风点火
骁龙8+平板只要2399!小米是懂人性弱点的-天天热讯
全网千万人学鼻子转牙签 详细教程在此:你学废了吗? 前沿热点
实时焦点:必胜韩国语园地原声韩剧在线观看_必胜韩国语园地
斩赤红之瞳结局谁活着_斩赤红之瞳结局
快消息!时隔7年季后赛再拿两双 两次重伤打不垮辽宁铁人
动态物体追踪 每日简讯
一季度苹果手机均价6800元 iPhone 14 Pro最畅销|全球即时看
上海漫展惊现“女菩萨”:还真有人顶礼膜拜-全球热头条