今天给大家介绍一下TypeScript的一些新功能和发展。这些是我在日常工作中经常使用的功能。直接在构造函数中定义属性在Typescript中,可以直接通过构造函数的参数来定义属性。看一下早期的做法:content;this.history=history;}}使用ts中的缩写语法:classNote{constructor(publictitle:string,publiccontent:string,privatehistory:string[]){//这里不用写this.title=title}}它可能看起来不像带有属性的类,但它确实是,使用Typescript提供的简写形式——使用构造函数的参数直接定义属性。这个简写语法做了很多:声明一个构造函数参数及其类型声明一个同名的公共属性当我们创建这个类的实例时,将属性初始化为相应的参数值Nullmerge??其实没什么意思,就是Nul??lishCoalescing(空值合并)。听起来有点懵,直接上代码consti=undefinedconstk=i??5console.log(k)//5//3.9.2compileconsti=undefined;constk=i!==null&&i!==void0?i:5;console.log(k);//5这个时候你肯定是想说到此结束了吧?letk=i||5虽然也用这个,但是你不觉得不严谨吗?如果i=0会怎样?私有类字段TypeScript3.8将支持ECMAScript私有字段,这不能与TypeScriptprivate修饰符混淆。这是一个在TypeScript中带有私有类字段的类:classAnimal{#name:string;constructor(theName:string){this.#name=theName;}}前者有更好的运行时保证。使用private关键字声明的TypeScript字段将成为编译后的JavaScript代码中的常规字段。另一方面,私有类字段在编译代码中保持私有。试图在运行时访问私有类字段将导致语法错误。我们也无法使用浏览器开发工具检查私有类字段。有了私有类字段,我们终于在JavaScript中拥有了真正的隐私。命名元组类型(Labeledtupletypes)命名元组类型需要TypeScript4.0及以上版本才能使用。大大提升了我们的开发体验和效率。我们来看一个例子:typeAddress=[string,number]functionsetAddress(...args:Address){//somecodehereconsole.log(args)}当我们这样定义函数入参时,在使用函数的时候,小编的聪明prompt只会提示我们参数类型,失去了参数描述的意义。为了改进这一点,我们可以传递Labeled元组类型,我们可以这样定义参数:typeAddress=[streetName:string,streetNumber:number]functionsetAddress(...args:Address){//somecodehereconsole.log(args)}这样,在调用函数的时候,我们的参数就得到了相应的语义,使得代码更容易维护。模板字面量类型从ES6开始,我们可以利用模板字面量(TemplateLiterals)的特性来编写带反引号的字符串,而不仅仅是单引号或双引号:constmessage=`text`;正如FlavioCopes所说,模板文字提供了用引号写的字符串以前没有的功能:定义多行字符串非常方便允许轻松插值变量和表达式可以使用模板标签创建DSL(领域特定语言))模板文字类型和JavaScript中的模板字符串语法完全一样,只是在类型定义中使用了:typetopBottom="top"|"bottom"typeleftRight="left"|"right"typePosition=`${topBottom}-${leftRight}`当我们定义一个具体的字面量类型时,TypeScript会通过拼接内容的方式生成一个新的字符串字面量类型。实用程序类型TypeScript为您提供了一组实用程序类型,允许您在现有类型之上构建新类型。有许多适用于不同情况的实用程序类型,例如选择类型属性以复制、大写或使所有属性可选。下面是一个使用省略工具的示例,它复制了原始类型的所有属性,但我们选择不包含的属性除外。typeUser={name:stringage:numberlocation:string}typeMyUser=Omit
