TypeScript 是一种通过增加类型和类型查看构建在 JavaScript 之上的语言。类型能够形容诸如对象的形态、如何调用函数以及属性是否能够为 null 或 undefined 之类的货色。TypeScript 能够查看这些类型,以确保咱们不会在程序中出错,这样咱们就能够自信地编码。它还能够为编辑器中的主动实现、转到定义和重构等其余工具提供反对。事实上,如果您应用过 Visual Studio 或 VS Code for JavaScript 等编辑器,您其实曾经体验过由 TypeScript 提供的反对了!

satisfies 运算符

TypeScript 开发人员常常面临两难地步:咱们既要确保某些表达式匹配某些类型,又要保留该表达式的最具体类型以用于推理目标。

新的 satisfies 运算符让咱们验证表达式的类型是否匹配某种类型,而不更改该表达式的后果类型。例如,咱们能够应用 satisfies 来验证 palette 的所有属性是否与 string | number[] 兼容:

type Colors = "red" | "green" | "blue";type RGB = [red: number, green: number, blue: number];const palette = {    red: [255, 0, 0],    green: "#00ff00",    bleu: [0, 0, 255]//  ~~~~ The typo is now caught!} satisfies Record<Colors, string | RGB>;// Both of these methods are still accessible!const redComponent = palette.red.at(0);const greenNormalized = palette.green.toUpperCase();

应用 in 运算符放大未列出属性的范畴

作为开发人员,咱们常常须要解决在运行时不齐全已知的值。事实上,咱们通常不晓得属性是否存在,无论咱们是从服务器取得响应还是读取配置文件。JavaScript 的 in 运算符能够查看对象上是否存在属性。

以前,TypeScript 容许咱们放大任何未明确列出属性的类型的范畴。

interface RGB {red: number;green: number;blue: number;}interface HSV {hue: number;saturation: number;value: number;}function setColor(color: RGB | HSV) {if ("hue" incolor) {// 'color' now has the type HSV }// ...}

在这里,RGB 类型没有列出色调并放大范畴,留给咱们的是 HSV 类型。

TypeScript 4.9 使 in 运算符在放大未列出属性的类型时更加弱小。该语言不会按原样保留它们,而是将它们的类型与 Record<"property-key-being-checked", unknown> 相交。

interface Context { packageJSON: unknown;}function tryGetPackageName(context: Context): string | undefined {const packageJSON = context.packageJSON;// Check to see if we have an object.if (packageJSON && typeof packageJSON === "object") {// Check to see if it has a string name property.if ("name" in packageJSON && typeof packageJSON.name === "string") {// Just works!return packageJSON.name; } }return undefined;}

TypeScript 4.9 还增强了一些对于如何应用 in 的查看,确保左侧可调配给类型 string | number | symbol,右侧可调配给对象。这有助于查看咱们是否应用了无效的属性键,而不是不小心查看基元。

主动拜访器

TypeScript 4.9 反对 ECMAScript 中行将推出的性能,称为主动拜访器。主动拜访器的申明就像类的属性一样,除了它们是用 accessor 关键字申明。

class Person {    accessor name: string;        constructor(name: string) {        this.name = name;    }}

查看 NaN 是否相等

JavaScript 开发人员的一个次要难题是应用内置的相等运算符查看值 NaN。对于某些背景,NaN 是一个非凡的数值,代表“不是数字”。没有什么能等于 NaN——即便是 NaN!但至多对称,所有总是不等于 NaN。

严格来说,这不是特定于 JavaScript 的问题,因为任何蕴含 IEEE-754 浮点数的语言都具备雷同的行为。然而 JavaScript 的次要数字类型是浮点数,而 JavaScript 中的数字解析通常会导致 NaN。反过来,查看 NaN 最终变得相当广泛,正确的办法是应用 Number.isNaN——但正如咱们提到的,很多人不小心最终应用 someValue === NaN 进行查看。

TypeScript 当初与 NaN 间接比拟时会出错,并且会倡议应用 Number.isNaN 的一些变体。

function validate(someValue: number) {return someValue !== NaN;//    ~~~~~~~~~~~~~~~~~// error: This condition will always return 'true'.//       Did you mean '!Number.isNaN(someValue)'?}

咱们认为,此更改应该严格有助于捕捉初学者谬误,相似于 TypeScript 以后在与对象和数组文字进行比拟时收回谬误的形式。

File-Watching 应用文件系统事件

在 TypeScript 4.9 中,文件监督默认由文件系统事件提供反对,只有在咱们未能设置基于事件的监督程序时才会回退到轮询。对于大多数开发人员来说,当以 --watch 模式运行或应用 TypeScript 反对的编辑器(如 Visual Studio 或 VS Code)运行时,这应该会提供更少的资源密集型体验。

文件监督的工作形式依然能够通过环境变量和 watchOptions 进行配置。一些编辑器如 VS Code 能够独立反对 watchOptions。应用源代码驻留在网络文件系统(如 NFS 和 SMB)上的更奇异设置的开发人员可能须要抉择回到旧行为。不过,如果服务器具备正当的解决能力,则启用 SSH 并近程运行 TypeScript 可能会更好,这样它就能够间接拜访本地文件。VS Code 有很多近程扩大来简化这件事。

编辑器的“Remove Unused Imports”和“Sort Imports”命令

在 TypeScript 4.3 中,咱们引入了一个名为“Sort Imports”的命令,它只会对文件中的导入进行排序,但不会删除它们——并且会像这样重写文件。

import { bar, foo } from "./helper";import { HoneyBadger, Moose, Zebra } from"./zoo";let x: Moose | HoneyBadger = foo();

“Sort Imports”的正告是,在 Visual Studio Code 中,此性能仅可用作保留时命令,而不是可手动触发的命令。

TypeScript 4.9 减少了另一半,当初提供了“Remove Unused Imports”。TypeScript 当初将删除未应用的导入名称和语句,但会独自保留绝对程序。

import { Moose, HoneyBadger } from"./zoo";import { foo } from "./helper";let x: Moose | HoneyBadger = foo();

所有心愿应用任一命令的编辑器都能够应用此性能;但值得注意的是,Visual Studio Code(1.73 及更高版本)将内置反对,并将通过其命令面板显示这些命令。

更多 TypeScript 4.9 公布信息请返回原博客查看~