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 的新模块解析策略。这个策略旨在与打包程序(如 Webpack 和 Rollup)配合使用,从而实现更高效、更流畅的构建过程(就像过去在 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 发布:快速概览
探索最令人兴奋的功能和更新 作为一种不断发展的编程语言,TypeScript 带来了大量的改进和新功能。在本文中,我们将深入探讨 TypeScript 的最新版本 5.0,并探索其最值得关注的更新。 1. 装饰器 TypeScript 5.0 引入了一个重新设计的装饰器系…...
【图像处理 】卡尔曼滤波器原理
目录 一、说明 二、它是什么? 2.1 我们可以用卡尔曼滤波器做什么? 2.2 卡尔曼滤波器如何看待您的问题...
YOLOv5 实例分割入门
介绍 YOLOv5 目标检测模型以其出色的性能和优化的推理速度而闻名。因此,YOLOv5 实例分割模型已成为实时实例分割中最快、最准确的模型之一。 在这篇文章中,我们将回答以下关于 YOLOv5 实例分割的问题: YOLOv5检测模型做了哪些改动,得到了YOLOv5实例分割架构?使用的 Prot…...
数字城市发展下的技术趋势,你知道多少?
提到数字城市、智慧城市大家都会感觉经常在耳边听到,但是要确切说出具体的概念还是有一点难度的。具体来说:数字城市是一个集合多种技术的系统,以计算机技术、多媒体技术和大规模存储技术为基础,以宽带网络为纽带,运用…...
linux 串口改为固定
在/etc/udev/rules.d 目录下新建定义规则的文件 1. 文件名要按规范写否则改动无效2. 规则文件必须以.rules 结尾3. 规则文件名称必须遵循 xx-name.rules 格式(xx 为数字或字母,name 为规则名称),例如 99-serial-ports.rules。4. 规…...
【SCI一区】考虑P2G和碳捕集设备的热电联供综合能源系统优化调度模型(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&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,不能达到完成自动化安装agent的效果。想通过脚本一键安装agent,而不需要在蓝鲸平台进行过…...
python 图片保存成视频
👨💻个人简介: 深度学习图像领域工作者 🎉工作总结链接:https://blog.csdn.net/qq_28949847/article/details/128552785 链接中主要是个人工作的总结,每个链接都是一些常用demo,…...
uniapp 引入 Less SCSS
✨求关注~ 😀博客:www.protaos.com 本文将介绍如何在 UniApp 中引入 Less 和 SCSS,两种流行的 CSS 预处理器。通过使用 Less 和 SCSS,你可以在 UniApp 项目中更灵活地编写样式,并享受预处理器提供的便利功能。 代码实现…...
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模板类? arma::fcube是Armadillo线性代数库中的一种数据类型,它是一个三维的float类型张量。Armadillo库是一个C科学计算库,提供了高效的线性代数和矩阵运算。…...
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(本机)、Virtual Pascal和XCode编译器。 同时,VMProtect有一个内置的反汇编程序,可以与Windows和Mac OS X可执行文件一起…...
国产仪器 4945B/4945C 无线电通信综合测试仪
4945系列无线电通信综合测试仪是多功能、便携式无线电综合测试类仪器,基于软件无线电架构,集成了跳频信号发生与分析、矢量信号发生与解调分析、模拟调制信号发生与解调分析、音频信号发生与分析、音频示波器、自动测试等功能,它可完成无线通…...
数据库原理及应用上机实验一
✨作者:命运之光 ✨专栏:数据库原理及应用上机实验报告整理 目录 ✨一、实验目的和要求 ✨二、实验内容与步骤 🍓🍓前言: 数据库原理及应用上机实验报告的一个简单整理后期还会不断完善🍓🍓…...
【操作系统】线程常用操作
线程号 就像每个进程都有一个进程号一样,每个线程也有一个线程号。进程号在整个系统中是唯一的,但线程号不同,线程号只在它所属的进程环境中有效。 进程号用 pid_t 数据类型表示,是一个非负整数。线程号则用 pthread_t 数据类型…...
C++编译预处理
目录 一、包含头文件 1)#include包含头文件又两种方式: ①#include<文件名>: ②#include"文件名": 2)C98标准后的头文件: ①C的标准库 ②C的标准库 3)注意 二、宏定义 1…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...
论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing
Muffin 论文 现有方法 CRADLE 和 LEMON,依赖模型推理阶段输出进行差分测试,但在训练阶段是不可行的,因为训练阶段直到最后才有固定输出,中间过程是不断变化的。API 库覆盖低,因为各个 API 都是在各种具体场景下使用。…...
面试高频问题
文章目录 🚀 消息队列核心技术揭秘:从入门到秒杀面试官1️⃣ Kafka为何能"吞云吐雾"?性能背后的秘密1.1 顺序写入与零拷贝:性能的双引擎1.2 分区并行:数据的"八车道高速公路"1.3 页缓存与批量处理…...
怎么开发一个网络协议模块(C语言框架)之(六) ——通用对象池总结(核心)
+---------------------------+ | operEntryTbl[] | ← 操作对象池 (对象数组) +---------------------------+ | 0 | 1 | 2 | ... | N-1 | +---------------------------+↓ 初始化时全部加入 +------------------------+ +-------------------------+ | …...
基于 HTTP 的单向流式通信协议SSE详解
SSE(Server-Sent Events)详解 🧠 什么是 SSE? SSE(Server-Sent Events) 是 HTML5 标准中定义的一种通信机制,它允许服务器主动将事件推送给客户端(浏览器)。与传统的 H…...
