微软发布TypeScript 3.2候选版,添加strictBindCallApply标签以及BigInts类型

发布TypeScript 3.1候选版后隔2个月,微软再次发布更新,发布TypeScript 3.2候选版,除了提供更严格的绑定(Binding)、调用(Call)和应用(Apply)检查标签strictBindCallApply,另外还允许在泛型上使用展开运算符,并增加了新的BigInt类型。

TypeScript 3.2将提供更严格的绑定、调用和应用检查,微软TypeScript项目经理Daniel Rosenwasser解释,在JavaScript中绑定、调用和应用是函数中的方法,允许开发者执行诸如绑定或是部分应用参数,使用不同的值调用函数,或是把数组当作参数调用函数等操作。

不过,由于早期,TypeScript缺乏对这些函数进行建模的能力,而绑定、调用和应用都被设计成输入任意数量的参数,并且回传任意参数的形式。虽然在ES2015的箭头函数和Rest/Spread参数,提供了开发者另一种新语法,能简单的以更有效率的方式表达其中一些方法,但是由于有以类型安全(Type-safe)的方式对这些模式建模的需求,让微软重新正视了这个问题。

Daniel Rosenwasser提到,TypeScript存在两个功能,可以打开正确的抽象,在不需要写死代码的情况下,就能精确的设计绑定、调用和应用,这两个功能分别是在TypeScript 2.0就有的this参数类型,以及TypeScript 3.0中具元组(Tuple)类型的建模参数表表(Modeling Parameter Lists)。

结合两者,当开发者使用strictBindCallApply新标签的时候,可以针对绑定、调用和应用的使用,进行更严格的检查。使用strictBindCallApply时,由新的全局类型CallableFunction描述可调用对象的方法,该类型声明了更严格的绑定、调用和应用的签章版本。

而对于泛型的更新,TypeScript 3.2现在允许在泛型上使用展开运算符(Spread Operator),而这让需要参数的地方得以进行可迭代扩展,像是获取类似数组的对象,将其扩展成一组可以复制到另一个数组的Item。

Daniel Rosenwasser提到,类型系统尝试对展开运算符行为建模,并且复写新的属性或是尝试忽略方法,但不幸的是,过去这些事情都无法在泛型中进行。但这个问题现在获得解决,TypeScript 3.2允许对象在泛型中展开,并使用Intersections对其建模。另外,泛型还可以与对象Rest模式一同使用,以类似展开(Spread)的方法,其创建了一个新对象,并排除了部分属性。

第三个TypeScript 3.2的重要更新便是开始支持BigInt,让编码可以在理论上仿真任意大整数(Large integers),而这也是即将到来的ECMAScript提案。Daniel Rosenwasser表示,TypeScript 3.2为BigInts增加了类型检查,并支持针对esnext发出BigInt常值(Literal)。TypeScript中的BigInt引入一种称为bigint的新原语类型,他特别强调,BigInt支持仅适用于esnext目标。