这 六个 TS 新特性经常用到,用了之后我再也离不开它!

开发 前端
今天来介绍一下 TypeScript 的一些较新的功能和进展,这些是我在日常工作中经常在用的功能。希望对你有所帮助!

[[418393]]

今天来介绍一下 TypeScript 的一些较新的功能和进展,这些是我在日常工作中经常在用的功能。

在构造函数中直接定义属性

Typescript 中可以通过构造函数的参数直接定义属性,我们来先看早期的做法:

  1. class Note { 
  2.   public title: string; 
  3.   public content: string; 
  4.   private history: string[]; 
  5.    
  6.   constructor(title: string, content: string, history: string[]) { 
  7.     this.title = title; 
  8.     this.content = content; 
  9.     this.history = history; 
  10.      
  11.   } 

采用 ts 中简写的语法:

  1. class Note { 
  2.   constructor( 
  3.      public title: string,  
  4.      public content: string,  
  5.      private history: string[] 
  6.   ){ 
  7.     // 这里不用在写 this.title = title 
  8.   } 

它可能看上去不像是有属性的类,但它确实有,利用的是 Typescript 提供的简写形式 — 用构造函数的参数直接定义属性。

这个简写语法做了很多:

  • 声明了一个构造函数参数及其类型
  • 声明了一个同名的公共属性
  • 当我们 new 出该类的一个实例时,把该属性初始化为相应的参数值

空值合并

??其实没啥意思,就是Nullish Coalescing (空值合并)。听起来有点懵,我们直接上代码

  1. const i = undefined 
  2. const k = i ?? 5 
  3. console.log(k) // 5 
  4.  
  5. // 3.9.2编译 
  6. const i = undefined; 
  7. const k = i !== null && i !== void 0 ? i : 5; 
  8. console.log(k); // 5 

这个时候你肯定是想说了这样不就完了吗?

  1. let k = i || 5 

虽然这样也用,但是你不觉得很不严谨吗?如果i = 0呢?

私有类字段

TypeScript 3.8 将支持 ECMAScript 私有字段,千万别和 TypeScript private 修饰符 混淆。

这是在 TypeScript 中具有私有类字段的类:

  1. class Animal { 
  2.   #name: string; 
  3.   constructor(theName: string) { 
  4.     this.#name = theName; 
  5.   } 

在private关键字之上使用私有类字段的区别在于前者有更好的运行时保证。用private关键字声明的 TypeScript 字段将在编译后的JavaScript代码中成为常规字段。另一方面,私有类字段在编译后的代码中仍然是私有的。

试图在运行时访问私有类字段将导致语法错误。我们也使用浏览器开发工具也检查不了私有类字段。

有了私有类字段,我们终于在JavaScript中得到了真正的隐私。

命名元组类型(Labeled tuple types)

命名元组类型适需要 TypeScript 4.0及以上版本才能使用,它极大的改善了我们的开发体验及效率,先来看一个例子:

  1. type Address = [string, number] 
  2.  
  3. function setAddress(...args: Address) { 
  4.   // some code here 
  5.   console.log(args) 

当我们这样定义函数入参后,在使用函数时,编辑器的智能提示只会提示我们参数类型,丢失了对参数含义的描述。

图片

为了改善这一点,我们可以通过 Labeled tuple types,我们可以这样定义参数:

  1. type Address = [streetName: string, streetNumber: number] 
  2.  
  3. function setAddress(...args: Address) { 
  4.   // some code here 
  5.   console.log(args) 
图片

这样,在调用函数时,我们的参数就获得了相应的语义,这使得代码更加容易维护。

模板字面量类型

自 ES6 开始,我们就可以通过模板字面量(Template Literals)的特性,用反引号来书写字符串,而不只是单引号或双引号:

  1. const message = `text`; 

正如 Flavio Copes 所言,模板字面量提供了之前用引号写的字符串所不具备的特性:

  • 定义多行字符串非常方便
  • 可以轻松地进行变量和表达式的插值
  • 可以用模板标签创建 DSL(Domain Specific Language,领域特定语言)

模板字面量类型和 JavaScript 中的模板字符串语法完全一致,只不过是用在类型定义里面:

  1. type topBottom = "top" | "bottom" 
  2. type leftRight = "left" | "right" 
  3.  
  4. type Position = `${topBottom }-${leftRight }` 
图片

当我们定义了一个具体的字面量类型时,TypeScript 会通过拼接内容的方式产生新的字符串字面量类型。

实用类型

TypeScript为你提供了一组实用类型,让你在现有类型的基础上构建新的类型。有许多实用类型涵盖了不同的情况,例如选择类型属性来复制,大写字母,或使所有的属性都是可选的。

下面是一个使用 Omit工具的例子,它复制了原始类型的所有属性,除了我们选择不包括的那些。

图片
  1. type User = { 
  2.   name: string 
  3.   age: number 
  4.   location: string 
  5.  
  6. type MyUser = Omit<User'name'

上面这些就是我工作经常使用的一部分,另外一些后面在分享,就这?

 

责任编辑:姜华 来源: 大迁世界
相关推荐

2021-05-16 07:44:01

Hadoop大数据HDFS

2021-10-27 10:15:25

Python新特性编程语言

2022-07-22 16:30:25

MacmacOS

2022-09-26 17:52:58

React

2021-08-23 11:35:00

工具yyds开源

2016-05-03 15:12:35

数据科学

2021-06-16 07:56:48

C++新特性类型

2022-03-01 15:23:02

设计师创新互联网

2022-02-24 10:48:01

Pycharm插件

2023-10-07 09:52:30

容器Init

2023-04-19 15:26:52

JavaScriptES13开发

2016-01-04 15:20:46

2016趋势互联网

2021-11-16 11:30:10

Linux命令运维

2023-01-10 14:54:19

2017-12-28 23:30:14

云计算混合云云安全

2023-11-26 18:26:26

聚类评价指标监督学习

2012-06-15 11:30:55

ibmdw

2021-09-03 09:57:13

开源技术 项目

2019-07-19 20:34:32

2024-04-11 08:29:35

Kafka异步发送发送端重试
点赞
收藏

51CTO技术栈公众号