TypeScript 4.9 发布!

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();</colors,>

使用 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

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 及更高版本)将内置支持,并将通过其命令面板显示这些命令。

Original: https://blog.csdn.net/helendemeng/article/details/128330467
Author: 微软技术栈
Title: TypeScript 4.9 发布!

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/777013/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • NLP标注工具Brat的简单使用

    目录 写在前面 1. 背景 2. Brat的安装与启动 3. Brat的运行 4. 标注配置与标注 (1) 原始数据文件准备 (2) 配置文件配置 (3) 标注 (4) 中文标签配…

    Python 2023年9月15日
    0170
  • 2019年‘泰迪杯’数据分析职业技能大赛A题——个人代码分享

    目录 题目 任务 1 数据预处理与统计 任务 2 数据分析与可视化 代码展示 任务一 任务二 题目 任务 1 数据预处理与统计 任务 1.1 对数据作必要的预处理,在报告中列出处理…

    Python 2023年8月23日
    087
  • this硬绑定

    一、this显式绑定 this显式绑定,顾名思义,它有别于this的隐式绑定,而隐式绑定必须要求一个对象内部包含一个指向某个函数的属性(或者某个对象或者上下文包含一个函数调用位置)…

    Python 2023年10月19日
    050
  • Part 9:Pandas 的字符串处理操作

    Pandas字符串处理 前面我们已经使用了字符串的处理函数:df[“bWendu”].str.replace(“℃”,”…

    Python 2023年8月21日
    097
  • Conda&&Pip 使用

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 一、conda 配置环境 1.查看conda版本 2.升级conda版本 3.修改conda下载源渠道 4….

    Python 2023年9月8日
    057
  • python pygame基础学习2: display mask 图显示可视化(原创)

    pygame.mask….,比如pygame.mask.from_surface,是游戏编程中检测碰撞的一个非常有用的函数, 为了理解mask的原理和作用,视图化mas…

    Python 2023年9月22日
    055
  • scrapy爬取起点中文网24小时热销榜单

    系列文章目录 第一章 scrapy爬取起点中文网24小时热销榜单。 文章目录 系列文章目录 前言 一、项目需求 二、项目分析 三、程序编写 * 1.编写item(数据存储) 2.编…

    Python 2023年10月2日
    042
  • Vue3 企业级优雅实战 – 组件库框架 – 5 组件库通用工具包

    本文继续组件库开发环境的搭建,前面两篇分别介绍了组件库中组件项目的初始化、组件库 CSS 架构,本文介绍通用工具库的搭建。在组件开发过程中,可能会调用一些通用的工具函数,这些工具函…

    Python 2023年10月15日
    053
  • MQ 概念介绍 / 配置以及原理 简书

    文章目录 1、什么是MQ 2、MQ的多种产品 3、MQ的工作原理 4、ActiveMQ 的配置 5、ActiveMQ 的数据存储方式 6、ActiveMQ的主从服务 7、Activ…

    Python 2023年9月26日
    040
  • RK3568平台开发系列讲解(音视频篇)FFmpeg公共基础参数

    🚀返回专栏总目录; 文章目录 一、公共操作部分 二、每个文件主要操作部分 三、视频操作部分 四、音频操作部分 沉淀、分享、成长,让自己和他人都能有所收获!😄 📢当我们使用 FFmp…

    Python 2023年11月6日
    048
  • python插值与拟合

    由这张图我们粗略的了解插值和拟合:下面正式介绍。 一维插值 一维插值就是在已知互不相同的观测点除的函数值:寻找一个近似函数使得,也就是这个函数的曲线要通过所有观测点。这样我们就能观…

    Python 2023年8月23日
    065
  • JS新年倒计时

    ✅作者简介:热爱国学的Java后端开发者,修心和技术同步精进。🍎个人主页:Java Fans的博客🍊个人信条:不迁怒,不贰过。小知识,大智慧。💞当前专栏:前端案例分享专栏✨特色专栏…

    Python 2023年11月6日
    047
  • 安装conda+python+pytorch+pyg+ogb指定版本(最全面)

    windows 安装conda+python+pytorch+pyg+ogb指定版本(最全面) * – conda创建虚拟环境 – 安装pytorch &#…

    Python 2023年9月9日
    0128
  • Mac 下virtualenv pipenv venv conda 区别解读 及 conda 安装 uwsgi 注意事项

    两个环境 版本环境 版本环境的意思是可以控制当前python的全局版本号以及所有跟此版本号有关的lib 虚拟环境 为了隔离不同项目所依赖的python包,避免所有的项目依赖的包都放…

    Python 2023年9月8日
    085
  • 服务架构的演变与SpringCloud

    CSDN话题挑战赛第2期参赛话题:学习笔记 学习之路,长路漫漫,写学习笔记的过程就是把知识讲给自己听的过程。这个过程中,我们去记录思考的过程,便于日后复习,梳理自己的思路。学习之乐…

    Python 2023年10月7日
    052
  • django常用包

    Django==3.2.9django-cors-headers==3.10.0djangorestframework==3.12.4dynaconf==3.1.7PyJWT==2…

    Python 2023年8月5日
    045
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球