当前位置: 首页 > news >正文

Typescript 5.0 发布:快速概览

探索最令人兴奋的功能和更新

作为一种不断发展的编程语言,TypeScript 带来了大量的改进和新功能。在本文中,我们将深入探讨 TypeScript 的最新版本 5.0,并探索其最值得关注的更新。

1. 装饰器

TypeScript 5.0 引入了一个重新设计的装饰器系统,改进了类型检查和元数据生成。装饰器现在更加无缝地与类型系统配合,使您能够编写更干净、更健壮的代码。以下是一个简单的方法装饰器的示例:

function log<This, Args extends any[], Return>(target: (this: This, ...args: Args) => Return,context: ClassMethodDecoratorContext<This,(this: This, ...args: Args) => Return>
) {const methodName = String(context.name);function replacementMethod(this: This, ...args: Args): Return {console.log(`LOG: Entering method '${methodName}'.`);const result = target.call(this, ...args);console.log(`LOG: Exiting method '${methodName}'.`);return result;}return replacementMethod;
}class Calculator {@logadd(a: number, b: number): number {return a + b;}
}const calculator = new Calculator();
console.log(calculator.add(2, 3)); 
// "LOG: Entering method 'add'." 
// "LOG: Exiting method 'add'." 
// 5 

在这个例子中,@log 装饰器在每次调用方法时记录方法名。除了方法装饰器,TypeScript 5.0 还支持自动访问器装饰器、getter 和 setter 装饰器等。您可以在这个快速指南中了解更多:

TypeScript 5.0 装饰器快速指南

使用装饰器扩展您的 TypeScript 5.0 工具包

2. const 类型参数

在 TypeScript 5.0 之前,它的推断通常会选择更一般的类型,例如将 ["Alice", "Bob", "Eve"] 推断为 string[],如果您想要更具体的类型,则必须为其添加 as const

// string[]
const a = ["Alice", "Bob", "Eve"]// readonly ["Alice", "Bob", "Eve"]
const b = ["Alice", "Bob", "Eve"] as const

而 TypeScript 5.0 允许您在类型参数声明中添加 const 修饰符:

declare function fnGood<const T extends readonly string[]>(args: T): void;// T is readonly ["a", "b", "c"]
fnGood(["a", "b" ,"c"]);

但请记住,const 修饰符仅影响在调用中编写的对象、数组和原始表达式的推断,因此无法(或无法)通过 as const 修改的参数不会看到任何行为上的变化:

declare function fnGood<const T extends readonly string[]>(args: T): void;
const arr = ["a", "b" ,"c"];// 'T' is still 'string[]'-- the 'const' modifier has no effect here
fnGood(arr);

3. 支持在 extends 中使用多个配置文件

TypeScript 5.0 可以在您的 tsconfig.json 中扩展多个配置文件。此功能使得在项目之间共享和管理配置更加容易。以下是如何使用多个配置文件的示例:

{"extends": ["./config/base", "./config/jest"],"compilerOptions": {"target": "esnext","module": "commonjs","strict": true}
}

在这个例子中,配置文件扩展了 base 和 jest 配置,允许您根据需要组合和覆盖设置。

4. 所有枚举都是联合枚举

在 TypeScript 5.0 中,所有枚举现在都被视为联合枚举。联合枚举提供了更好的类型安全性和更好的人机工程学,以处理枚举值。以下是一个示例:

enum E {A = 10 * 10, // Numeric literal enum memberB = 'foo', // String literal enum memberC = Math.random(), // Opaque computed enum member
}function getStringValue(e: E): string {return String(e);
}const val = getStringValue(E.A); // "100"

TypeScript 5.0 通过为每个计算成员创建唯一类型来将所有枚举转换为联合枚举。这意味着现在所有枚举都可以被缩小并且其成员也可以被引用为类型。

5. — moduleResolution bundler

TypeScript 5.0 引入了一个名为 bundler 的新模块解析策略。这个策略旨在与打包程序(如 WebpackRollup)配合使用,从而实现更高效、更流畅的构建过程(就像过去在 Node.js 模块中的任何相对导入都需要包括文件扩展名一样)。 要启用 bundler 模块解析策略,请在 tsconfig.json 中使用以下配置:

{"compilerOptions": {"moduleResolution": "bundler"}
}

6. 解析自定义标志

TypeScript 5.0 添加了几个新标志来自定义模块解析过程。这些标志提供了更细粒度的控制,以控制模块是如何解析的,使您能够微调构建过程。以下是一个简要概述:

  • --allowImportingTsExtensions:允许导入带有 TypeScript 特定扩展名(如 .ts、.mts 或 .tsx)的 TypeScript 文件。
  • --resolvePackageJsonExports:强制 TypeScript 在从 node_modules 中的包中读取时,查看 package.json 文件的 exports 字段。
  • --resolvePackageJsonImports:强制 TypeScript 在从以 # 开头的查找开始时,查看 package.json 文件的 imports 字段。
  • --allowArbitraryExtensions:允许通过查找以 {file basename}.d.{extension}.ts 格式的声明文件来导入具有未知扩展名的文件。
  • --customConditions:在 TypeScript 从 package.json 的 exports 或 imports 字段解析时,采用额外的条件列表。

7. --verbatimModuleSyntax

TypeScript 5.0 中的新 --verbatimModuleSyntax 标志允许您在发出 JavaScript 代码时保留原始模块语法。这个特性在与打包程序一起工作时特别有用,因为它可以防止需要额外的转换。例如:

// Erased away entirely.
import type { A } from "a";// Rewritten to 'import { b } from "bcd";'
import { b, type c, type d } from "bcd";// Rewritten to 'import {} from "xyz";'
import { type xyz } from "xyz";

要启用此标志,请将其添加到您的 tsconfig.json

{"compilerOptions": {"verbatimModuleSyntax": true}
}

8. 支持 export type *

TypeScript 5.0 引入了对 export type * 语法的支持,允许您重新导出另一个模块中的所有类型。这种语法特别适用于创建仅包含类型的模块或聚合来自多个源的类型。以下是一个示例:

// types.ts
export type { Foo } from './foo';
export type { Bar } from './bar';// index.ts
export type * from './types';
// Also support
export type * as Types from './types';

在这个例子中,index.ts 模块使用 export type * 语法重新导出了 types.ts 模块中的所有类型。

9. JSDoc 中的 @satisfies 支持

TypeScript 5.0 中的新 @satisfies JSDoc 标签使您能够指定函数实现满足特定接口。这个特性在使用结构类型或使用 TypeScript 对 JavaScript 代码进行类型检查时特别有用。以下是一个示例:

// interface Greeter {
//   greet(name: string): number;
// }/*** @typedef {Function} Greeter* @param {string} name* @returns {string}*//*** @satisfies {Greeter}*/
function greeter(name: string) {return `Hello, ${name}!`;
}

在这个例子中,greeter 函数带有 @satisfies JSDoc 标签,表示它满足 Greeter 接口。

10. JSDoc中的@overload支持

TypeScript 5.0添加了对@overload JSDoc标签的支持,允许您为JavaScript代码中的单个实现定义多个函数签名。当处理需要支持多种参数类型或形状的复杂函数时,此功能特别有用。以下是一个示例:

/*** @overload* @param {string} a* @param {string} b* @return {string}*//*** @overload* @param {number} a* @param {number} b* @return {number}*//*** @param {string | number} a* @param {string | number} b*/
export function add(a, b) {if (typeof a === 'number' && typeof b === 'number') {return a + b;} else if (typeof a === 'string' && typeof b === 'string') {return a.concat(b);}
}const numResult = add(1, 2); // 3
const strResult = add('hello', 'world'); // "helloworld"
const errResult = add('hello', 123); // Error: No overload matches this call.

在此示例中,add函数用两个@overload JSDoc标记标记,指定它可以处理数字和字符串作为参数。

11. 在--build下传递特定于emit的标志

TypeScript 5.0引入了在使用--build标志时传递特定于emit的标志的能力。此功能允许您在构建项目时微调输出,从而对构建过程进行更精细的控制。一些新闻:

  • --declaration:从项目中的TypeScript和JavaScript文件生成.d.ts文件。
  • --emitDeclarationOnly:仅输出d.ts文件而不是JavaScript文件。
  • --declarationMap:为d.ts文件创建源映射。
  • --sourceMap:为发出的JavaScript文件创建源映射文件。
  • --inlineSourceMap:将源映射文件包含在发出的JavaScript中。

12. 编辑器中的大小写不敏感导入排序

TypeScript 5.0通过使导入排序不区分大小写来改进编辑器中的导入排序。这种改变导致组织导入时出现更自然和直观的排序顺序,从而产生更清晰和可读的代码。

13. 完整的switch/case自动完成

TypeScript 5.0通过提供完整的switch/case自动完成增强了代码完成体验。在使用联合类型时,编辑器现在可以建议所有可能的情况,减少错过情况的机会,使编写全面的switch语句更容易。以下是一个示例:

type Animal = "cat" | "dog" | "fish";function speak(animal: Animal): string {switch (animal) {// TypeScript 5.0 will suggest all possible cases: "cat", "dog", "fish"}
}

14. 速度、内存和包大小优化

TypeScript 5.0带来了各种性能优化,包括更快的类型检查、减少的内存使用和更小的包大小。这些改进使使用TypeScript更加愉快,确保平稳高效的开发体验。

15. 破坏性变化和弃用

与任何主要版本发布一样,TypeScript 5.0引入了一些破坏性变化和弃用。在升级之前,仔细查看发行说明并彻底测试您的项目是至关重要的。一些值得注意的破坏性变化包括:

  • 运行时要求:TypeScript现在针对ECMAScript 2018。TypeScript包还设置了最低期望引擎为12.20。对于Node用户,这意味着TypeScript 5.0的最低版本要求至少是Node.js 12.20及更高版本。
  • lib.d.ts更改:对如何生成DOM类型的更改可能会对现有代码产生影响。值得注意的是,某些属性已从number转换为数字文字类型,并且有关剪切、复制和粘贴事件处理的属性和方法已移动到不同的接口。
  • API Breaking Changes:已移至模块,删除了一些不必要的接口并进行了一些正确性改进。
  • 禁止在关系运算符中进行隐式强制类型转换:
function func1(ns: number | string) {return ns * 4; // Error, possible implicit coercion
}function func2(ns: number | string) {return ns > 4; // Error, possible implicit coercion
}function func3(ns: number | string) {return +ns > 4; // OK
}
  • 枚举重大改进:在TypeScript 5.0中,您将不会看到那些枚举奇怪的问题,以下是两个重要的错误改进:
// Part1: Assigning an out-of-domain literal to an enum type 
// now errors out as one would expect.
enum SomeEvenDigit {Zero = 0,Two = 2,Four = 4,
}// Now correctly an error
let m: SomeEvenDigit = 1;// Part2: Enums declaring values with mixed numeric and 
// indirect string enum references incorrectly create an all-numeric enum.
enum Letters {A = 'a',
}
enum Numbers {one = 1,two = Letters.A,
}// Now correctly an error
const t: number = Numbers.two;
  • 在—experimentalDecorators下更准确的参数装饰器类型检查(在构造函数中)
  • 一些已弃用的配置和配置值

结论

总之,TypeScript 5.0带来了许多功能和改进,那么哪个功能最有用呢?

相关文章:

Typescript 5.0 发布:快速概览

探索最令人兴奋的功能和更新 作为一种不断发展的编程语言&#xff0c;TypeScript 带来了大量的改进和新功能。在本文中&#xff0c;我们将深入探讨 TypeScript 的最新版本 5.0&#xff0c;并探索其最值得关注的更新。 1. 装饰器 TypeScript 5.0 引入了一个重新设计的装饰器系…...

【图像处理 】卡尔曼滤波器原理

目录 一、说明 二、它是什么? 2.1 我们可以用卡尔曼滤波器做什么? 2.2 卡尔曼滤波器如何看待您的问题...

YOLOv5 实例分割入门

介绍 YOLOv5 目标检测模型以其出色的性能和优化的推理速度而闻名。因此,YOLOv5 实例分割模型已成为实时实例分割中最快、最准确的模型之一。 在这篇文章中,我们将回答以下关于 YOLOv5 实例分割的问题: YOLOv5检测模型做了哪些改动,得到了YOLOv5实例分割架构?使用的 Prot…...

数字城市发展下的技术趋势,你知道多少?

提到数字城市、智慧城市大家都会感觉经常在耳边听到&#xff0c;但是要确切说出具体的概念还是有一点难度的。具体来说&#xff1a;数字城市是一个集合多种技术的系统&#xff0c;以计算机技术、多媒体技术和大规模存储技术为基础&#xff0c;以宽带网络为纽带&#xff0c;运用…...

linux 串口改为固定

在/etc/udev/rules.d 目录下新建定义规则的文件 1. 文件名要按规范写否则改动无效2. 规则文件必须以.rules 结尾3. 规则文件名称必须遵循 xx-name.rules 格式&#xff08;xx 为数字或字母&#xff0c;name 为规则名称&#xff09;&#xff0c;例如 99-serial-ports.rules。4. 规…...

【SCI一区】考虑P2G和碳捕集设备的热电联供综合能源系统优化调度模型(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

Redis缓存数据库(四)

目录 一、概述 1、Redis Sentinel 1.1、docker配置Redis Sentinel环境 2、Redis存储方案 2.1、哈希链 2.2、哈希环 3、Redis分区(Partitioning) 4、Redis面试题 一、概述 1、Redis Sentinel Redis Sentinel为Redis提供了高可用解决方案。实际上这意味着使用Sentinel…...

View中的滑动冲突

View中的滑动冲突 1.滑动冲突的种类 滑动冲突一般有3种, 第一种是ViewGroup和子View的滑动方向不一致 比如: 父布局是可以左右滑动,子view可以上下滑动 第二种 ViewGroup和子View的滑动方向一致 第三种 第三种类似于如下图 2.滑动冲突的解决方式 滑动冲突一般情况下有2…...

java boot项目基础配置之banner与日志配置演示 并教会你如何使用文档查看配置

上文 我们简单讲了一下 springboot 项目的配置 都是写在resources下的application.properties中 springboot 项目中 配置都写在这一个文件 可以说非常方便 不像之前 写个项目配置这里一个哪里一个 看到是非常费力 我们启动项目 这里有个图案 其实 这叫 banner 我们就用配置来…...

蓝鲸平台通过标准运维 API 安装 Agent

目录 一、背景 二、目的 三、创建安装agent流程 四、通过标准运维 API 安装 Agent 五、总结 一、背景 蓝鲸平台正常情况纳管主机需要在节点管理手工安装agent&#xff0c;不能达到完成自动化安装agent的效果。想通过脚本一键安装agent&#xff0c;而不需要在蓝鲸平台进行过…...

python 图片保存成视频

&#x1f468;‍&#x1f4bb;个人简介&#xff1a; 深度学习图像领域工作者 &#x1f389;工作总结链接&#xff1a;https://blog.csdn.net/qq_28949847/article/details/128552785 链接中主要是个人工作的总结&#xff0c;每个链接都是一些常用demo&#xff0c…...

uniapp 引入 Less SCSS

✨求关注~ &#x1f600;博客&#xff1a;www.protaos.com 本文将介绍如何在 UniApp 中引入 Less 和 SCSS&#xff0c;两种流行的 CSS 预处理器。通过使用 Less 和 SCSS&#xff0c;你可以在 UniApp 项目中更灵活地编写样式&#xff0c;并享受预处理器提供的便利功能。 代码实现…...

Linux程序设计:文件操作

文件操作 系统调用 write //函数定义 #include <unistd.h> size_t write(int fildes, const void *buf, size_t nbytes); //示例程序 #include <unistd.h> #include <stdlib.h> int main() { if ((write(1, “Here is some data\n”, 18)) ! 18)write(2, …...

【自制C++深度学习推理框架】Tensor模板类的设计思路

Tensor模板类的设计思路 为什么要把Armadillo线性代数库arma::fcube封装成Tensor模板类&#xff1f; arma::fcube是Armadillo线性代数库中的一种数据类型&#xff0c;它是一个三维的float类型张量。Armadillo库是一个C科学计算库&#xff0c;提供了高效的线性代数和矩阵运算。…...

linux--systemd、systemctl

linux--systemd、systemctl 1 介绍1.1 发展sysvinitupstart主角 systemd 登场 1.2 简介 2 优点兼容性启动速度systemd 提供按需启动能力采用 linux 的 cgroups 跟踪和管理进程的生命周期启动挂载点和自动挂载的管理实现事务性依赖关系管理日志服务systemd journal 的优点如下&a…...

加密解密软件VMProtect教程(七):主窗口之控制面板“详情”部分

VMProtect是新一代软件保护实用程序。VMProtect支持德尔菲、Borland C Builder、Visual C/C、Visual Basic&#xff08;本机&#xff09;、Virtual Pascal和XCode编译器。 同时&#xff0c;VMProtect有一个内置的反汇编程序&#xff0c;可以与Windows和Mac OS X可执行文件一起…...

国产仪器 4945B/4945C 无线电通信综合测试仪

4945系列无线电通信综合测试仪是多功能、便携式无线电综合测试类仪器&#xff0c;基于软件无线电架构&#xff0c;集成了跳频信号发生与分析、矢量信号发生与解调分析、模拟调制信号发生与解调分析、音频信号发生与分析、音频示波器、自动测试等功能&#xff0c;它可完成无线通…...

数据库原理及应用上机实验一

✨作者&#xff1a;命运之光 ✨专栏&#xff1a;数据库原理及应用上机实验报告整理 目录 ✨一、实验目的和要求 ✨二、实验内容与步骤 &#x1f353;&#x1f353;前言&#xff1a; 数据库原理及应用上机实验报告的一个简单整理后期还会不断完善&#x1f353;&#x1f353;…...

【操作系统】线程常用操作

线程号 就像每个进程都有一个进程号一样&#xff0c;每个线程也有一个线程号。进程号在整个系统中是唯一的&#xff0c;但线程号不同&#xff0c;线程号只在它所属的进程环境中有效。 进程号用 pid_t 数据类型表示&#xff0c;是一个非负整数。线程号则用 pthread_t 数据类型…...

C++编译预处理

目录 一、包含头文件 1&#xff09;#include包含头文件又两种方式&#xff1a; ①#include<文件名>: ②#include"文件名"&#xff1a; 2&#xff09;C98标准后的头文件&#xff1a; ①C的标准库 ②C的标准库 3&#xff09;注意 二、宏定义 1&#xf…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络&#xff0c;将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具&#xff0c;支持 Chrome、Firefox、Safari 等主流浏览器&#xff0c;提供多语言 API&#xff08;Python、JavaScript、Java、.NET&#xff09;。它的特点包括&a…...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统&#xff0c;可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析&#xff1a;自动解析Markdown文档结构PPT模板分析&#xff1a;分析PPT模板的布局和风格智能布局决策&#xff1a;匹配内容与合适的PPT布局自动…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式&#xff0c;然后找到相应的网卡&#xff08;可以查看自己本机的网络连接&#xff09; windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置&#xff0c;选择刚才配置的桥接模式 静态ip设置&#xff1a; 我用的ubuntu24桌…...

嵌入式学习笔记DAY33(网络编程——TCP)

一、网络架构 C/S &#xff08;client/server 客户端/服务器&#xff09;&#xff1a;由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序&#xff0c;负责提供用户界面和交互逻辑 &#xff0c;接收用户输入&#xff0c;向服务器发送请求&#xff0c;并展示服务…...