最近发布的TypeScript 4.0提供了一个大杂烩式的改进,包括改进编码编辑器的体验、构建场景和对变量元组类型的支持。让我们仔细看看在这个最新版本中,开发者可以利用的一些改进。
对变量元组类型的支持
TypeScript 4.0做了两个不同的更新,允许更灵活地输入元组。第一个更新允许通用类型在定义元组时使用传播语法,这对涉及元组或数组的通用传播的场景很有用,因为其中的类型不一定知道。第二项更新允许在元组的任何地方使用休息元素,而不仅仅是在末尾。这些改进的一个很好的用例可以在为下面的函数定义类型时找到:
function concat(arr1, arr2) {
return [...arr1, ...arr2];
}
在这个版本之前,为了正确地打字,人们必须为数组类型的所有可能情况创建一个类型定义。如果你试图为这个函数列出一些定义,你很快就能根据concat 的使用方式列出无限的定义,比如说:
function concat<A, B, C, D, E, F>(arr1: [A, B, C, D], arr2: [E, F]): [A, B, C, D, E, F] {
return [...arr1, ...arr2];
}
这一改进使得开发者可以定义一个更灵活的concat函数。相反,人们现在可以定义这个函数来更准确地描述这种情况:
function concat<T extends Arr, U extends Arr>(arr1: T, arr2: U): [...T, ...U] {
return [...arr1, ...arr2];
}
标记的元组元素
TypeScript 4.0 带来了改进的可读性,能够标记元组元素,虽然这没有改进类型检查,但对于其他开发者来说,这将有助于帮助你的代码可读性。例如,假设你有一个元组FlightTime,有一个出发和到达的时间,现在可以写成下面这样:
type FlightTime = [departure: Date, arrival: Date];
想象一下,使用一个以这个元组为参数的函数,当使用这样一个函数时,IntelliSense现在可以让你知道元组值的标签,非常方便

来自构造函数的隐含属性类型
开发人员现在可以启用noImplicitAny 选项,让 TypeScript 从构造函数中暗示类属性的类型。以前TypeScript会假设一个类型any ,如果没有指定的话:
class Coffee {
// Previously this type was implied as any
// Now it's inferred to type `number`!
ounces;
constructor(ounces: number) {
this.ounces = ounces;
}
}
其他4.0 TypeScript变化
在这个版本中还有一些其他的更新需要注意:
- 对于使用VSCode的大型TypeScript项目,有明显的加载延迟,长达一分钟,这已经被部分加载的经验缩短到几秒钟,其中只有编辑器打开的当前文件将被处理,直到完整的语言服务准备好。
- 更加聪明的自动导入已经实现,以自动包括不在
node_modules/@types文件夹中的类型依赖。在此之前,不在node_modules/@types文件夹中的软件包的自动导入只有在项目中的其他地方至少有一个明确的导入后才能发挥作用。 - 当使用启用了
--incremental和 --noEmitOnError标志的构建模式时,速度得到了提高,以前使用这些标志的构建时间非常慢,因为没有信息被缓存在.tsbuildinfo文件中。 - JS文档标签
/** @deprecated */,现在可以用来向编辑者表示某些声明已经被废弃。例如,在VSCode中,该值将以醒目的方式显示。
渴望更多TypeScript知识?请查看我们的《TypeScript权威指南》 ,了解更深入的内容。另外,如果你需要一些帮助,可以随时联系我们。如果你正在升级TypeScript版本,会有一些突破性的变化,所以在升级前一定要查看发布说明。