您现在的位置: 首页 观点 > > 正文
天天微动态丨TypeScript 学习笔记 — 模板字符串和类型体操(十五)
发布时间:2023-05-04 16:00:07 来源:博客园


(相关资料图)

目录
  • 基本介绍
  • 字符串类型体操实操环节
    • 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 模板字符串非常类似,,通过 ${}包裹,

  1. 模板字符串类型的目的就是将多个字符串组装在一起
type name = "Echoyya";type sayHaha = `hi ${name} haha`; // type name = "Echoyya";
  1. 模板字符串具备分发的机制可以组成联合类型实现:marign-left、 margin-top、 margin-bottom.....
type Direction = "left" | "right" | "top" | "bottom";type size = "10" | "20";type AllMargin = `margin-${Direction}:${size}px;`;
  1. 在映射类型中使用模板字符串

对象属性重命名

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;

标签:

天天微动态丨TypeScript 学习笔记 — 模板字符串和类型体操(十五)

基本介绍TS中模板字符串类型与JS模板字符串非常类似,,通过${}包裹,模板字符串类型的目的就是将多个字符串

劳模工匠代表杨叶婷:在宝山科创“蝶变”篇章中书写投促精彩篇章|观天下

编者按:劳动创造幸福,实干成就伟业。在2023年宝山区庆祝“五一“国际劳动节大会上,四位劳模工匠结合...

梦洁股份(002397)5月4日主力资金净买入590.32万元 当前简讯

截至2023年5月4日收盘,梦洁股份(002397)报收于3 96元,上涨5 88%,换手率4 01%,成交量23 09万手,成交额9055 62万元。

降胆红素最快的十种食物_胆红素偏高的治疗方法 世界快讯

1、病情分析:这位朋友,你好,胆红素升高的原因很多,就其发病机理分类,可分为胆红素生成过多(即溶血性黄疸

快讯2023-05-04 14:03:10

5月4日电,德国3月季调后贸易帐录得167亿欧元,为2021年2月以来新高,预期163亿欧元。

2023上半年四川省人力资源和社会厅厅属事业单位招聘工作人员笔试成绩及面试资格审查的公告_当前速递

根据《四川省人力资源和社会厅关于厅属事业单位2023年上半年公开招聘工作人员的公告》(以下简称《公告》)规

环球短讯!NH、Pero无缘PGS1总决赛,GODV:我看一下AZ的机票,给他升个舱!

NH、Pero无缘PGS1总决赛,GODV:我看一下AZ的机票,给他升个舱!,godv,全球总决赛

当前速读:智飞生物:23价肺炎多糖疫苗已申请生产注册

5月4日电,智飞生物接受机构调研时称,目前,23价肺炎多糖疫苗已申请生产注册、四价流感疫苗、人二倍体狂苗

热搜!白孔雀为躲游客拔毛,被多辆缆车碾死!官方最新回应……

孔雀为躲游客拔毛被滑车碾死

2023年湖北自考专业成绩怎么查询? 今日热闻

湖北自考专业成绩怎么查询?关于这个问题继续教育网自学平台小编就简单为大家说一下。点击进入:自考有疑问

【环球速看料】“五一”消费观察:黄金周餐饮消费持续回暖 销量可观

上证报中国证券网讯(记者李雁争李丹)餐饮业是促消费、惠民生、稳就业的重点领域,也是经济复苏的“晴...

洗牙要多久洗一次合适_洗牙要多久|世界快资讯

1、牙齿一般洗牙的时间是根据患者能否保持良好的口腔卫生以及有效的刷牙方法来决定的,一般情况下,如果患

大帝复出致哈登失魂?14中2+三分6中0低迷沉底 篮筐都扎心登哥 环球简讯

大帝复出致哈登失魂?14中2+三分6中0低迷沉底篮筐都扎心登哥,绿凯,费城,大帝,霍福德,美国篮球,詹姆斯·哈登

“百城万企”民企高校携手促就业行动启动|环球新动态

由全国工商联、教育部、人力资源和社会保障部主办的“百城万企”民企高校携手促就业行动近日在京启动。...

涡阳县气象台更新暴雨黄色预警[III级/较重] 【2023-05-04】

【来源:涡阳县气象台】涡阳县气象台2023年05月04日04时24分变更发布暴雨黄色预警信号。预计未来6小时内我

U22国奥1-3不敌克罗地亚第四级别领头羊,热身赛惨遭五连败

U22国奥1-3不敌克罗地亚第四级别领头羊,热身赛惨遭五连败,国奥,u22,克罗地亚,莱斯特城队

【天天速看料】新兴铸管股份有限公司广州销售分公司_关于新兴铸管股份有限公司广州销售分公司简介

1、新兴铸管股份有限公司广州销售分公司于2002年05月16日成立。2、法定代表人任宪超,公司经营范围包括:建

今日热闻!香港4月份楼宇买卖合约共5755份 其中住宅合约共4583份

据香港土地注册处公布数据显示,4月份送交该外注册的所有种类楼宇买卖合约共5755份,按月下跌33 1%,按年则

天天快消息!打造新热点 创造新场景 激发新活力——昆明多措并举促进消费恢复升级

文旅消费丰富多彩,新场景人气火爆。“五一”假期,昆明长水国际机场、昆明火车站人头攒动,教场中路蓝...

【独家焦点】实惨!男子拍演唱会:激光导致手机摄像头直接报废

据长江说法,湖北武汉一男子坐前排看演唱会,手机录像时,一道激光扫过,手机摄像头直接报废。视频中可以看

今日热讯:尿片属于什么垃圾啊_尿片属于什么垃圾分类

1、宝宝尿布算湿垃圾注:湿垃圾又称为厨余垃圾、有机垃圾,即易腐垃圾,指食材废料、剩菜剩饭、过期食品、

天黑了室友要看书请点亮灯泡74关_天黑了室友要看书请点亮灯泡|世界速递

1、天黑了室友要看书请点亮灯泡怎么按:这奌生活常识都没有???是飯来张口衣来伸手之辈?哈。2、地球人都

竖括号怎么打的_竖括号怎么打

1、用竖排文本框打就可以了。2、[ ]是这个吗?键盘上有啊利用软键盘输入即可用插付号的方法也行的哈有一个

“五一”假期海口社会治安交通秩序持续向好[图]

5月3日,记者从海口警方获悉,“五一”假期海口警方全警动员,全面强化社会面巡逻防控,多措并举做好景...

苾澜纯净清颜去角质啫喱_关于苾澜纯净清颜去角质啫喱的简介

音频解说1、苾澜纯净清颜去角质啫喱是由(株)喜来健健康和美容生产的一款化妆品,于2021年4月16日备案。本

90后父母“躺平式”带娃旅游,一天打卡5个景点|天天快看点

欧洲经济增长疲弱 面临下行风险

当前关注:五一返程高峰要来了:峰值拥堵1.6倍于出程

普安县气象台继续发布干旱橙色预警信号【Ⅱ/严重】【2023-05-03】-今亮点

湖南娄底市房价(湖南娄底市)-焦点热闻

埃及官员:埃及正考虑与中国等国用本币结算 减少对美元需求_世界热点评

知乎(02390)涨逾3% 3月至今累计回购18次公司股份-全球新动态

大巴黎对梅西痛下狠手,做出“三停”处罚,背后或隐藏着一个真相

【全球速看料】小新Talkshow:不止二人转铁锅炖!哈尔滨浪漫麻了

石炭纪大灭绝_石炭纪

世界今热点:优化服务便捷老年人出行

成都猎头公司排行_成都猎头公司排名

铁路等部门助力“五一”小长假旅客平安有序出行

qq下载不了怎么登录_qq下载不了怎么回事-环球今日报

世界最新:np肉h_np肉

科学化思维工具详解(产品运营篇)

君住长江头我住长江尾表情包_君住长江头我住长江尾

【全球新视野】Omdia观察:卫星连接正在全球物联网连接市场中发挥作用

怎么取消手机报_取消手机报的方法

天天观速讯丨春莲这个名字怎么样_春莲这个名字指的是什么意思

电损标准_电损率一般是多少-全球热推荐

国际货币基金组织:亚太范围内 中国对全球经济增长的贡献排名第一

【韩系动向968】起亚纯电SUV EV9韩国预售,折合人民币不到50万!

延长运营时间!天津地铁最新通告! 每日消息

【自带debuff】前曼联后卫保罗-帕克评价马奎尔会让队友变差-焦点速读

稳健!为了防止数据泄露三星禁止员工使用生成式AI工具

馆陶县气象台发布大风蓝色预警【Ⅳ级/一般】【2023-05-02】

2023年5月2日山东省氯化石蜡价格最新行情预测

期盼的眼神的图片 期盼的意思 焦点快播

彩虹6号配置要求和csgo_彩虹6号配置_快报

新华社权威快报丨5月新规来了,关系你我生活_世界观速讯

欠款起诉能把钱要回来吗|当前播报

全球资讯:巨魔神灵武士_神灵武士

快讯:累的多音字_累的含义

骨结核症状有哪些能治好_骨结核症状有哪些

全国游泳冠军赛:潘展乐打破亚洲纪录夺男子100米自由泳冠军

生态免漆板柜门 生态免漆板

液相荧光检测器_液相检测器

创维汽车黄宏生:盈亏平衡点是卖10万辆 明年实现_天天快看

全球快看点丨微光

美国地质勘探局:日本Katsuren-haebaru东南偏东方向80公里发生5.4级地震。-每日观察

实时焦点:最新排名来了!43家上市券商业绩出炉,16家净利3位数增长!自营收入大反攻,一季度大赚464亿

全球热资讯!奋进强国建设 民族复兴新征程详细内容

全球讯息:新华网评:为身边的“民间高手”喝彩

滚动:五一假期第三天 路网流量仍处于高位运行态势

【世界时快讯】昌平区市场监管局持续做好“五一”期间市场秩序和安全服务保障工作

假期最后一波消费券今晚8点开抢 有效期截至5月16日-天天实时

“五一”国际劳动节丨这些收获源于____-世界今热点

环球快消息!青浦新城站成全线最早开工站点,当前已进入地下连续墙施工阶段

电气人的五一正确打开方式是什么?你看了就知道!|环球热消息

x 广告
x 广告

Copyright ©  2015-2022 华中自然网版权所有  备案号:京ICP备12018864号-26   联系邮箱:2 913 236 @qq.com