「译」TypeScript终极指南三:语法糖

原文来自 The Definitive TypeScript Guide -(https://www.sitepen.com/blog/2018/10/29/update-the-definitive-typescript-guide/

语法糖

在深入研究TypeScript的静态类型功能之前,必须先知晓一下TypeScript中对函数所做的一些改善,其中一些改变使类型系统的特性更易于理解。

TypeScript包括对函数的四个主要改进:可选参数,默认参数,剩余参数和箭头函数。

现在可以通过使用问号作为后缀来定义可选参数:

「译」TypeScript终极指南三:语法糖

在这里,exclusive是一个可选参数。 在JavaScript中这并没有意义,因为所有参数都是可选的,但在TypeScript中,编译器禁止漏掉参数,除非它们被指定为可选参数或具有默认值。

可选参数基本上只是隐性地将undefined指定为默认值的参数。 使用不同的值作为可选参数赋予默认值就像使用问号指定某个参数为可选参数一样简单:

「译」TypeScript终极指南三:语法糖

在这种情况下,min是可选的,默认值为0,exclusive是可选的,默认值为false。

TypeScript还提供了对可变参数的支持,该参数将传递给函数的任何额外参数收集到一个命名数组中:

「译」TypeScript终极指南三:语法糖

在此例中,调用publish('/ foo','a','b','c')将使得topic为字符串'/ foo',args为数组['a','b', 'C' ]。 请注意,使用此功能会为你的函数添加一个额外的循环,该循环在每次调用函数时运行用来将参数收集到rest参数中,因此注重性能的代码应直接针对arguments对象来进行操作。

TypeScript还支持ES2015的箭头函数。 这个新的函数方式提供了一种新的简写语法,并且还改变了this关键字的指向,因此它的值来自最近的词法作用域范围,而不是像常规JavaScript函数那样的指向调用者的上下文:

「译」TypeScript终极指南三:语法糖

TypeScript还支持对象简写,可减少对对象进行一些常规操作的代码量:

「译」TypeScript终极指南三:语法糖

解构

可以直接从数组中赋值多个变量:

「译」TypeScript终极指南三:语法糖

能这样子简写:

「译」TypeScript终极指南三:语法糖

解构也同样适用于对象:

「译」TypeScript终极指南三:语法糖

关于解构可以参考

TypeScript还包括很多当前或未来ECMAScript规范的功能,详情请参考 What's-new-in-TypeScript(https://github.com/Microsoft/TypeScript/wiki/What's-new-in-TypeScript)

类型

在不添加任何类型提示的情况下,TypeScript中的变量属于any类型,这意味着它们可以容纳任何类型的数据,就像在JavaScript中一样。 在TypeScript中向代码添加类型约束的基本语法如下所示:

「译」TypeScript终极指南三:语法糖

在上述代码中,toNumber函数接受一个必须是字符串的参数,并返回一个数字。变量num被显式地约束为数字类型(尽管TypeScript足够聪明,知道标准的parseFloat函数返回一个数字,因此可以推断该num是一个数字类型)。 TypeScript提供的基本类型与JavaScript的基本一致:any、number、string、boolean、void(即null或undefined)、never以及TypeScript 3.0中的unknown。在大多数情况下,never在代码流分析检测到无法访问的代码的函数中被推断出来,作为开发者不必担心它。例如,如果一个函数只抛出,它将获得一个never类型(原文:if a function only throws, it will get a nevertype)。 unknown是any类型的安全副本,但在使用该值之前某些位置会执行一些类型的类型检查。

在编写表达式(函数调用,算术运算等)时,你还可以显性地断言表达式的结果的类型,比如你调用了一个TypeScript无法自动推断出返回类型的函数,就很有必要了。例如:

「译」TypeScript终极指南三:语法糖

在此例中,numberStringSwap的返回值是不明确的(any类型),因为该函数可能返回多种类型。为了消除歧义,通过在调用时添加<number>前缀来显性地断言赋给num的值的类型。这在任何地方都能做,只要被断言的类型与返回值的类型兼容即可。换句话说,如果TypeScript知道numberStringSwap(‘1234’)会返回一个数字,则尝试断言<string>将导致编译器错误(“无法将数字转换为字符串”),因为已知这两种类型不兼容。还有一个替代的语法是使用as关键字,如上面对str的赋值所示。使用as与使用<>相同效果相同,但是,<>语法在.tsx文件中不可用,因为它在TSX中存在歧义。因此,as是类型声明的默认和首选语法。/<string>/<number>

在使用TypeScript编写代码时,最好将类型显性地添加到那些编译器无法推断出类型的变量和函数上。如果未对变量进行类型约束且编译器无法推断出类型,则会为其隐性地指定为any类型。在编译时,在tsconfig.json的compileOptions部分中设置“noImplicitAny”:true 将防止任何意外的隐性any类型藏在你的代码中(即编译器不够聪明能推断出正确类型的区域)。

TypeScript还支持字符串字面量类型。当你知道参数的值可以与字符串列表中的某一个匹配时,这将非常有用,例如:let easing: "ease-in" | "ease-out" | "ease-in-out";

局部类、接口、枚举和类型别名声明也能出现在函数声明中。局部类型的作用域范围被阻断,类似于使用let和const声明的变量。

未完待续,敬请期待下一篇


分享到:


相關文章: