原文地址: https://medium.com/better-programming/whats-new-in-typescript-3-9-70e3d2eabe26/
译文地址:https://github.com/xiao-T/note/blob/master/Published/typescript/What%E2%80%99s-New-in-TypeScript-3.9.md
本文版权归原作者所有,翻译仅用于学习。

5 月 12 号 TypeScript 发布了今年的第二个版本 v3.9。这是一个稳定版本。这篇文章,我将会介绍 v3.9 中引入的新功能。
@ts-expect-error
我们先看以下的示例,我们定义了一个有两个字符串参数的函数。
printName(firstName: string, lastName: string) {
console.log(firstName);
console.log(lastName);
assert(typeof firstName === "string");
assert(typeof lastName === "string");
}
通常,如果,TypeScript 用户错误的使用这个函数,他们会得到一个非常有用的错误提示信息,然而,JavaScript 用户将会得到一个断言错误信息。但是,如果我们为这个函数编写测试用例会发生什么呢?
expect(() => {
printName(1234, 5678);
}).toThrow();
如果,我们的测试用 TS 语法,将会抛出以下的错误信息:
printName(1234, 5678);
// ~~~
// error: Type ‘number’ is not assignable to type ‘string’.
为了解决这种问题,TypeScript 3.9 引入了新的功能:// @ts-expect-error 注释。如果,我们把这个注释放在代码行前面,TypeScript 就会忽略这个错误。但是,如果没有错误,TypeScript 就会提示代码中有不必要的注释,比如:Unused '@ts-expect-error' directive。
我们还可以把 // @ts-expect-error 作为抑制注释使用。// @ts-ignore 是一个早已存在的抑制注释。两者之间的区别是:// @ts-ignore 在接下来的代码行中没有错误会提示
(译者注:两者之间的区别是:两者都会忽略接下来代码行中的错误,只是在没有错误的情况下 // @ts-ignore 不会提示:有不必要的注释)
速度提升

TypeScript 早期版本中使用类似 Material-UI 这种库存在很多的编译速度问题。
新版本中,TypeScript 开发团队针对这类问题优化了大型联合、交叉、条件和映射类型,为 Material-UI 的编译节省了 40% 的时间。同时,他们还致力于有关 Visual Studio Code 等编辑器的文件重命名功能。
自动引入 CommonJS 模块
之前的版本,TypeScript 不管文件是什么类型只能引入 ECMAScript-style 的文件。但是,很多开发者还是使用 CommonJS-style require(),而没有使用 ECMAScript-style 的导入功能。
ECMAScript style:
import * as fs from "fs";
CommonJS style:
const fs = require("fs");
最新版本中,TypeScript 会自动检测导入的类型用于保证代码的整洁。
改善类型推断和 Promise.all
TypeScript v3.7 中更新了 Promise.all 和 Promise.race 的声明。但是,这次更新也带来了一些问题,因为,在同 null 或者 undefined 混合使用时会引起编译报错。下面通过示例演示一下:
interface Bird{
fly(): void
}
interface Fish{
singKissFromARose(): void
}
async function animalBehaviours(birdBehaviour: Promise<Bird>, fishBehaviour: Promise<Fish| undefined>) {
let [bird, fish] = await Promise.all([birdBehaviour, fishBehaviour]);
bird.fly();
// ~~~~
// Object is possibly ‘undefined’.
}
尽管,fishBehaviour 可能是 undefined,但是,还是会影响到 birdBehaviour。这种问题在 v3.9 中修复了。
代码重构保留空白行

很多开发者喜欢在每个功能代码块之间保留空白行,但是,早期的 TypeScript 代码重构不会保留空白行。它会移除所有的空白行。最新版本中,TypeScript 已经修复了这种问题,代码重构后会保留空白行。
(译者注:这个地方的提到的代码重构是指一些 IDE 附带的一些代码重构功能,比如:VS Code https://code.visualstudio.com/docs/editor/refactoring)
快速修复缺失的 return 语句
有时候,我们会忘记在函数结束时返回对应的值。现在,TypeScript 提供快速修复的方案,自动添加 return 语句。
在条件语句中检查未调用的函数
在 v3.7 之后,TypeScript 会检查 `if` 语句中未调用的函数并提示错误。在 v3.9 中,这一功能也支持三元运算符了。
其它的改变
相比以上的改变,还有一些微不足道的改变
- 在 JSX 中 } 和 > 被认为无效
- export * 被保留
- Getter 和 Setter 不在可枚举
- Type parameters which extend any are no longer acting as any
- libdom.d.ts 的改进
总的来说,这些改变在最新版本中都可以看到。因此,如果你喜欢 TypeScript,保持更新到最新的版本,可以让编写代码更高效。