当前位置: 首页 > 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…...

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言&#xff1a; 通过AI视觉技术&#xff0c;为船厂提供全面的安全监控解决方案&#xff0c;涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面&#xff0c;能够实现对应负责人反馈机制&#xff0c;并最终实现数据的统计报表。提升船厂…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...