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 发布信息请前往原博客查看~

TypeScript 4.9 发布!相关推荐

  1. TypeScript 2.1发布

    TypeScript是微软开发的一个JavaScript的超集,提供了最新的JavaScript特性以及可选的静态类型.近日,TypeScript 2.1发布.该版本提供了功能更为强大的类型检查器,并 ...

  2. TypeScript 3.7 发布,带来 Optional Chaining 等特性

    TypeScript 3.7 发布了,此版本带来了许多新特性. Optional Chaining 首先一大亮点是 Optional Chaining,这是社区呼唤特别强烈的一个 ECMAScript ...

  3. TypeScript 3.5 发布,速度提升、工具智能

    TypeScript 3.5 发布了,此版本在编译器.语言和编辑器工具上带来了一些新特性. 速度提升 TypeScript 3.5 引入了几种对于 type 检查和增量构建的优化,使得速度大幅提升. ...

  4. TypeScript 3.4 发布

    TypeScript 3.4 发布了,此版本主要更新内容如下: Faster subsequent builds with the --incremental flag:使用 --incrementa ...

  5. 华为称不会退出海外市场;英伟达证实遭遇黑客攻击;TypeScript 4.6发布 | 极客头条...

    「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧. 整理 | 苏宓 出品 | CSDN(ID:CSDNnews) ...

  6. 国内首个 App SDK 国家标准成功立项;苹果意外泄露iPhone 12发布时间;TypeScript 4.0 发布| 极客头条

    「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧. 国内要闻 国内首个 App SDK 国家标准成功立项,华为. ...

  7. 苹果意外泄露iPhone 12发布时间;阿里将停止印度部分服务;TypeScript 4.0 发布| 极客头条...

    整理 | 屠敏 头图 | CSDN 下载自东方 IC 快来收听极客头条音频版吧,智能播报由出门问问「魔音工坊」提供技术支持. 「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极 ...

  8. 互联网公司分批返岗;Safari 将封杀超过398天的 HTTPS 证书;TypeScript 3.8 发布 | 极客头条...

    整理 | 屠敏 快来收听极客头条音频版吧,智能播报由标贝科技提供技术支持. 「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注 ...

  9. 华为宣布方舟编译器将开源;​苹果秋季发布会定档9月10日;TypeScript 3.6 发布 | 极客头条...

    快来收听极客头条音频版吧,智能播报由标贝科技提供技术支持. 「CSDN 极客头条」,是从 CSDN 网站延伸至官方微信公众号的特别栏目,专注于一天业界事报道.风里雨里,我们将每天为朋友们,播报最新鲜有 ...

  10. ​搜狐大量员工遭遇“工资补助”诈骗;​腾讯客服回应“借钱就能避免微信号被封”;TypeScript 4.7发布|极客头条

    「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧. 整理 | 梦依丹 出品 | CSDN(ID:CSDNnews ...

最新文章

  1. 传输层协议(TCP/UDP)介绍
  2. C#是面向对象编程语言
  3. linux c之gcc编译出现error:lvalue required as unary ‘‘ operand解决办法
  4. rocketmq 订阅组_必须先理解的RocketMQ入门手册,才能再次深入解读
  5. 【算术、关系、逻辑、位、复合赋值、带副作用的、自增、自减、其它】运算符(学习笔记4--C语言运算符)
  6. 科学实证与理论研究方法
  7. 经济数据预测 | Python实现ELM极限学习机股票价格时间序列预测
  8. 通过DXGI实现高效抓屏
  9. 文件共享服务器 域组访问设置权限,怎么对局域网所共享的文件进行访问权限管理...
  10. python深度学习基于pytorch——arange、linspace 函数生成数组
  11. R语言笔记--par()函数详解
  12. 周记——20150907
  13. linux和尚取水设计,小和尚取水
  14. 【统计学】【2018.05】【含源码】时间序列:以密度预测评价方法为中心的预测与评价方法
  15. win10 家庭中文版内存占用过高
  16. 让屏幕日落而息的护眼神器——f.lux,自动调节屏幕色温,减少眼部疲劳
  17. 双系统-打不开Ubuntu
  18. 如何在不使用手机的前提下恢复/解密/还原加密后的.enc格式华为手机助手备份文件?
  19. AndroidStudio报错:Could not install Gradle distribution from ‘https://services.gradle.org/distribution
  20. vue中 敏感字眼的过滤

热门文章

  1. 【计算机网络 24】TCP/IP数据包结构详解
  2. 苹果iPad mini 6评测
  3. axios 跨域携带cookie设置
  4. 13.3、linux kernel介绍
  5. List集合存储学生对象用三种方式遍历
  6. 滤芯怎么换 石头机器人_石头扫地机滤网怎么清洗_小米扫地机滤网怎么拆_小米扫地机滤网...
  7. 03-树1 树的同构 判断树是否同构的略简单方法
  8. 从设计到开发,10大不容错过的效率提升工具
  9. Android 镂空效果的遮罩层实现
  10. r java 泛型_Java 泛型