




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第如何在TypeScript中处理日期字符串目录前言:一、模板字面量类型二、类型谓词缩小范围三、定义日期字符串总结:
前言:
在我最近的一个项目中,我必须去处理多个自定义的日期字符串表示法,比如YYYY-MM-DD和YYYYMMDD。由于这些日期是字符串变量,TypeScript默认会推断成为string类型。虽然这在技术实现上没有错,但是在工作中使用这样的类型定义是很宽泛的,使得有效处理这些日期字符串变得很困难。例如,letdog=alfie也被推断为一个string类型。
在这篇文章中,我会将我的解决方法呈现给你,通过输入这些日期字符串来改善开发者的体验并减少潜在的错误。
在进入编码之前,让我们简单回顾下实现目标需求要利用到的typescript特性,即模板字面量类型和通过类型谓词缩小范围。
一、模板字面量类型
在typescript4.1版本中引入,模板字面量类型和JavaScript的模板字符串语法相同,但是是作为类型使用。模板字面量类型解析为一个给定模板的所有字符串组合的联合。这听起来可能有点抽象,
直接看代码:
typePerson='Jeff'|'Maria'
typeGreeting=`hi${Person}!`//Templateliteraltype
constvalidGreeting:Greeting=`hiJeff!`//
//notethatthetypeof`validGreeting`istheunion`"hiJeff!"|"hiMaria!`
constinvalidGreeting:Greeting=`byeJeff!`//
//Type'"byeJeff!"'isnotassignabletotype'"hiJeff!"|"hiMaria!"
模板字面量类型非常强大,允许你对这些类型进行通用类型操作。例如,大写字母化。
typePerson='Jeff'|'Maria'
typeGreeting=`hi${Person}!`
typeLoudGreeting=UppercaseGreeting//Capitalizationoftemplateliteraltype
constvalidGreeting:LoudGreeting=`HIJEFF!`//
constinvalidGreeting:LoudGreeting=`hijeff!`//
//Type'"hiJeff!"'isnotassignabletotype'"HIJEFF!"|"HIMARIA!"
二、类型谓词缩小范围
typescript在缩小类型范围方面表现得非常好,可以看下面这个例子:
letage:string|number=getAge();
//`age`isoftype`string`|`number`
if(typeofage==='number'){
//`age`isnarrowedtotype`number`
}else{
//`age`isnarrowedtotype`string`
}
也就是说,在处理自定义类型时,告诉typescript编译器如何进行类型缩小是有帮助的。例如,当我们想在执行运行时验证后缩小到一个类型时,在这种情况下,类型谓词窄化,或者用户定义的类型守护,就可以派上用场。
在下面这个例子中,isDog类型守护通过检查类型属性来帮助缩小animal变量的类型:
typeDog={type:'dog'};
typeHorse={type:'horse'};
//customtypeguard,`petisDog`isthetypepredicate
functionisDog(pet:Dog|Horse):petisDog{
returnpet.type==='dog';
letanimal:Dog|Horse=getAnimal();
//`animal`isoftype`Dog`|`Horse`
if(isDog(animal)){
//`animal`isnarrowedtotype`Dog`
}else{
//`animal`isnarrowedtotype`Horse`
}
三、定义日期字符串
为了简洁起见,这个例子只包含YYYYMMDD日期字符串的代码。
首先,我们需要定义模板字面量类型来表示所有类似日期的字符串的联合类型
typeoneToNine=1|2|3|4|5|6|7|8|9
typezeroToNine=0|1|2|3|4|5|6|7|8|9
*Years
typeYYYY=`19${zeroToNine}${zeroToNine}`|`20${zeroToNine}${zeroToNine}`
*Months
typeMM=`0${oneToNine}`|`1${0|1|2}`
*Days
typeDD=`${0}${oneToNine}`|`${1|2}${zeroToNine}`|`3${0|1}`
*YYYYMMDD
typeRawDateString=`${YYYY}${MM}${DD}`;
constdate:RawDateString='19990223'//
constdateInvalid:RawDateString='19990231'//31stofFebruaryisnotavaliddate,butthetemplateliteraldoesntknow!
constdateWrong:RawDateString='19990299'//Typeerror,99isnotavalidday
从上面的例子可以得知,模板字面量类型有助于指定日期字符串的格式,但是没有对这些日期进行实际验证。因此,编译器将19990231标记为一个有效的日期,即使它是不正确的,只因为它符合模板的类型。
另外,当检查上面的变量如date、dateInvalid、dateWrong时,你会发现编辑器会显示这些模板字面的所有有效字符的联合。虽然很有用,但是我更喜欢设置名义类型,使得有效的日期字符串的类型是DateString,而不是19000101|19000102|19000103|...。在添加用户定义的类型保护时,名义类型也会派上用场。
typeBrandK,T=K{__brand:T};
typeDateString=BrandRawDateString,'DateString'
constaDate:DateString='19990101';//
//Type'string'isnotassignabletotype'DateString'
为了确保我们的DateString类型也代表有效的日期,我们将设置一个用户定义的类型保护来验证日期和缩小类型
/**
*Use`moment`,`luxon`orotherdatelibrary
constisValidDate=(str:string):boolean={
//...
//User-definedtypeguard
functionisValidDateString(str:string):strisDateString{
returnstr.match(/^\d{4}\d{2}\d{2}$/)!==nullisValidDate(str);
}
现在,让我们看看几个例子中的日期字符串类型。在下面的代码片段中,用户定义的类型保护被应用于类型缩小,允许TypeScript编译器将类型细化为比声明的更具体的类型。然后,在一个工厂函数中应用了类型保护,以从一个未标准化的输入字符串中创建一个有效的日期字符串。
/**
*Usageintypenarrowing
//validstringformat,validdate
constdate:string='19990223';
if(isValidDateString(date)){
//evaluatestotrue,`date`isnarrowedtotype`DateString`
//validstringformat,invaliddate(Februarydoensthave31days)
constdateWrong:string='19990231';
if(isValidDateString(dateWrong)){
//evaluatestofalse,`dateWrong`isnotavaliddate,evenifitsshapeisYYYYMMDD
*Usageinfactoryfunction
functiontoDateString(str:RawDateString):DateString{
if(isValidDateString(str))returnstr;
thrownewError(`Invaliddatestring:${str}`);
//validstringformat,validdate
constdate1=toDateString('19990211');
//`date1`,isoftype`DateString`
//invalidstringformat
constdate2=toDateString('asdf');
//Typeerror:Argumentoftype'"asdf"'isnotassignabletoparameteroftype'"19000101"|...
//validstringformat,invaliddate(Februarydoensthave31days)
co
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025至2030中国洗衣干衣设备市场经营创新策略及供需趋势研究报告
- 2025至2030中国氢燃料电池行业需求规模及投资效益研究报告
- 2025至2030中国气体膜市场供需规模与应用发展趋势前景报告
- 2025至2030中国杂志广告行业消费态势及营销趋势研究报告
- 2025至2030中国无线点餐行业竞争动态及投资效益研究报告
- 2025至2030中国婴儿洗衣液行业竞争格局与营销趋势研究报告
- 农村人居环境整治项目社会稳定风险评估与2025年应对措施报告
- 2025至2030中国围巾行业销售状况及竞争格局研究报告
- 2025至2030中国吸音喷涂市场发展趋势与投资规划建议研究报告
- 2025至2030中国六面顶液压机行业经营状况与发展前景研究报告
- 公安技术与警务指挥作业指导书
- 老年危重症患者的护理
- 《隧道测量》课件
- 《平凡的世界》中孙少平人物形象分析8500字(论文)
- 《结构式家庭疗法提升“丧偶式育儿”家庭亲密度的个案研究》
- 化学实验室废物处理管理制度
- 2024年六西格玛黄带认证考试练习题库(含答案)
- 第三章-足球-基本技术 足球运球绕杆 教学设计 人教版初中体育与健康七年级全一册
- 2024年同等学力英语考试真题及详解
- 会展活动场地布置与搭建技术规范手册
- “非遗”之首-昆曲经典艺术欣赏智慧树知到期末考试答案章节答案2024年北京大学
评论
0/150
提交评论