广州蓝景分享—快速了解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 {
  @log
  add(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 装饰器等。

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
  }
}

在此示例中,配置文件扩展了基本配置和玩笑配置,允许您根据需要组合和覆盖设置。

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

在 TypeScript 5.0 中,所有枚举现在都被视为联合枚举。 联合枚举为使用枚举值提供了更好的类型安全性和改进的人体工程学。 这是一个例子:

enum E {
  A = 10 * 10, // Numeric literal enum member
  B = 'foo', // String literal enum member
  C = 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 捆绑器

TypeScript 5.0 引入了一种新的模块解析策略,称为 bundler。此策略旨在与 Webpack 和 Rollup 等捆绑器一起使用,从而实现更高效和简化的构建过程(就像过去 Node.js 模块中的任何相关导入一样,需要包含文件扩展名)。

要启用 bundler 模块解析策略,请在 tsconfig.json 中使用以下配置:

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

6.自定义分辨率标志

TypeScript 5.0 添加了几个新标志来自定义模块解析过程。这些标志对如何解析模块提供了更精细的控制,使您可以微调构建过程。

以下是简要概述:

–allowImportingTsExtensions:允许导入带有 TypeScript 特定扩展名的 TypeScript 文件,例如 .ts、.mts 或 .tsx。

–resolvePackageJsonExports:强制 TypeScript 在从 node_modules 中读取包时查询 package.json 文件的导出字段。

–resolvePackageJsonImports:强制 TypeScript 在执行以 # 开头的查找时查询 package.json 文件的导入字段。

–allowArbitraryExtensions:允许通过查找 {file basename}.d.{extension}.ts 形式的声明文件来导入具有未知扩展名的文件。

–customConditions:获取当 TypeScript 从 package.json 的导出或导入字段解析时要考虑的附加条件列表。

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';

在此示例中,使用 export type * 语法将 types.ts 模块中的所有类型重新导出到 index.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 下传递特定于发射的标志

TypeScript 5.0 引入了在使用 --build 标志时传递 emit-specific 标志的能力。此功能允许您在构建项目时微调项目的输出,从而更好地控制构建过程。部分消息:

–declaration:从项目中的 TypeScript 和 JavaScript 文件生成 .d.ts 文件。

–emitDeclarationOnly:只输出 d.ts 文件,不输出 JavaScript 文件。

–declarationMap:为 d.ts 文件创建 sourcemaps。

–sourceMap:为发出的 JavaScript 文件创建源映射文件。

–inlineSourceMap:在发出的 JavaScript 中包含源映射文件。

12. 编辑器中不区分大小写的导入排序

TypeScript 5.0 通过不区分大小写改进了编辑器中的导入排序。在组织导入时,此更改会导致更自然和直观的排序顺序,从而使代码更清晰、更易读。

13. 详尽的开关/外壳完成

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 类型的生成方式可能会对现有代码产生影响。值得注意的是,某些属性已从数字转换为数字文字类型,并且用于剪切、复制和粘贴事件处理的属性和方法已跨接口移动。

API 重大更改:移至模块,删除了一些不必要的接口并进行了一些正确性改进。

关系运算符中禁止的隐式强制转换:

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
}

Enum Overhaul:在 TypeScript 5.0 中你不会看到那些奇怪的 enum 问题,这里有两个重要的错误改进:

// 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 带来了许多新功能,那么,您觉得哪个功能最有用?可以评论区说说您的看法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/14314.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI绘画——Checkpoint模型Dark Sushi Mix 大颗寿司Mix

目录 版本解析 模型简介 模型特性 模型演示&#xff08;多图预警&#xff09; Picture One 正面tag&#xff1a; 负面tag&#xff1a; Checkpoint模型darkSushiMixMix无Vae Checkpoint模型darkSushiMixMixVae模型kl-f8-anime2.ckpt Picture Two 正面tag&#xff1a;…

什么是OADM光分插复用器

文章导读&#xff1a; 什么是OADM光分插复用器 光分插复用器的功能 光分插复用器的类型&#xff08;FOADM, TOADM&#xff09; OADM的应用 1、什么是OADM光分插复用器 由不同的光通道进出单模光纤。 它的主要功能是在不影响其他波长信道传输的情况下&#xff0c;选择性地下载或…

python 的 object 与type的关系

python 的 object 与type的关系 是并列关系&#xff0c;两种是相互依赖的 查询父类 type.__bases__ object.__bases__(<class ‘object’>,) () 查询类型 type(type) type(object)<class ‘type’> <class ‘type’> 在python中&#xff0c;type用于描述…

开放原子训练营(第一季)铜锁探密:基于铜锁构建在线在线加密工具箱

基于铜锁构建Web在线加密工具库 搭建运行环境 实验⼿册中的实验都是以 docker 和 docker-compose 环境为主&#xff0c;基于 Ubuntu 20.04 容器镜像。 初始化项目 首先利用 IDE 创建一个 tongsuo_web 的空项目&#xff0c;接下来我们所有的文件都会创建在该项目中&#xff0…

ThinkPHP模型操作下

ThinkPHP模型操作下 前言1. 模型设置1.name(数据表除去前后缀的名字&#xff0c;默认是当前model的类名)2.table(完整的数据表名)3.pk 改变主键名称4.schema 设置模型对应数据表字段及类型5.disuse 数据表废弃字段&#xff08;数组&#xff09;6.模型的其他属性 2. 模型的主要功…

E5EAA HENF105240R1将用于工业生产过程的测量、控制和管理

​E5EAA HENF105240R1将用于工业生产过程的测量、控制和管理 工业控制计算机是工业自动化控制系统的核心设备 工业控制计算机是工业自动化设备和信息产业基础设备的核心。传统意义上&#xff0c;将用于工业生产过程的测量、控制和管理的计算机统称为工业控制计算机&#xff0c;…

JVM学习(八):运行时数据区——虚拟机栈(字节码程度深入剖析)

目录 一、概述 1.1 基于栈结构的虚拟机 1.2 栈和堆 二、虚拟机栈&#xff08;Java Virtual Machine Stack&#xff09;详述 2.1 虚拟机栈介绍 2.2 虚拟机栈作用 2.3 虚拟机栈特点 三、栈中常见的异常 3.1 StackOverflowError异常 3.2 OutOfMemoryError异常 四、…

Linux驱动开发:uboot启动流程详解

前言&#xff1a;uboot作为Linux驱动开发的 “三巨头” 之一&#xff0c;绝对是一座绕不开的大山。当然&#xff0c;即使不去细致了解uboot启动流程依旧不影响开发者对uboot的简单移植。但秉持着知其然知其所以然的学习态度&#xff0c;作者将给读者朋友细致化的过一遍uboot启动…

UE4 架构初识(二)

目录 UE4 引擎学习 一、架构基础 1. Pawn &#xff08;1&#xff09;DefaultPawn &#xff08;2&#xff09;SpectatorPawn &#xff08;3&#xff09;Character 2. AController 3. APlayerState 4. 总结 UE4 引擎学习 一、架构基础 1. Pawn UE也是从Actor中再派生…

【小程序】input输入双向数据绑定

小程序中&#xff0c;input标签中的数据为单向绑定&#xff1a; <inputtype"number"bindinput"inputRealmoney"value"{{ amount }}"placeholder"请输入金额" />如上代码&#xff0c;我们绑定了输入框的数据amount&#xff0c;并…

JavaSE-06 [面向对象OOP + 封装]

JavaSE-06 [面向对象OOP 封装] 第一章 面向对象思想 1.1 面向过程和面向对象 面向过程&#xff1a; 面向过程就是分析出解决问题所需要的步骤&#xff0c;然后用函数把这些步骤一步一步实现&#xff0c;使用的时候一个一个依次调用就可以了面向对象&#xff1a; 面向对象是…

MITA触摸屏维修WP4053米塔工控机控制屏维修

MITA-TEKNIK米塔触摸屏维修工控机工控屏控制器维修DISPLAY 2COM全系列型号 Mita-Teknik触摸屏维修常见故障&#xff1a;上电无显示&#xff0c;运行报故障&#xff0c;无法与电脑通讯&#xff0c;触摸无反应&#xff0c;触控板破裂&#xff0c;触摸玻璃&#xff0c;上电黑屏&a…

云原生|kubernetes|rancher-2.6.4安装部署简明手册

前言: rancher是一个比较特殊的开源的kubernetes管理工具&#xff0c;特殊在它是一个名称为k3s的简单kubernetes集群&#xff0c;而该集群是在kubernetes集群内的。 OK&#xff0c;本文将讲述如何在centos7服务器上&#xff0c;在已有的kubernetes-1.23.15集群内&#xff0c;…

springboot,Flowable 流程实例的激活与挂起(二)

一.简介 接上一篇 springboot&#xff0c;Flowable 流程实例的激活与挂起&#xff08;一&#xff09; 二.流程实例的挂起与激活 1.流程实例的挂起 挂起一个流程实例的代码如下&#xff1a; Test void test08() {List<ProcessDefinition> list repositoryService.cr…

Git相关使用

私人博客 许小墨のBlog —— 菜鸡博客直通车 系列文章完整版&#xff0c;配图更多&#xff0c;CSDN博文图片需要手动上传&#xff0c;因此文章配图较少&#xff0c;看不懂的可以去菜鸡博客参考一下配图&#xff01; 系列文章目录 前端系列文章——传送门 后端系列文章——传送…

数组模拟实现单链表快速操作

前言&#xff1a;我们都知道链表的一般模式是由结构体加指针来实现的&#xff0c;但是在实际的比赛中&#xff0c;结构体指针来实现链表的操作并不常用&#xff0c;原因是因为我们在增加节点时需要开辟新的内存&#xff0c;而比赛时给出的样例大多都是十几万个数据&#xff0c;…

找出1-1000中的所有完美数

再次练习查找完美数&#xff0c;找出 1-1000 中的所有完美数。 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程《 python 完全自学教程》&#xff0c;不仅仅是基础那么简单…… 地址&#xff1a;https://l…

Git的安装和学习使用(一)

本篇文章旨在分享本人在学习Git时的随笔记&#x1f929; 文章目录 一、Git 快速入门1.1 Git 概述1.2 SCM概述1.3 Git 安装1.3.1 软件下载1.3.2 软件安装1.3.3 软件测试 二、Git 基础使用2.1 Git 概念2.1.1 版本控制2.1.2 分布式2.1.3 系统2.1.4 区域 2.2 Git 基础指令2.2.1 Lin…

任务调度原理 通俗讲解详细(FreeRTOS)

寄存器说明 以cortex-M3&#xff0c;首先先要了解比较特别的几个寄存器&#xff1a; r15 PC程序计数器&#xff08;Program Counter&#xff09;,存储下一条要执行的指令的地址。 r14 LR连接寄存器&#xff08;Link Register &#xff09;&#xff0c;保存函数返回地址&#x…

Rancher 部署 Elasticsearch 8.5.1 版本服务

前言 从 es7 升级到 es8 之后&#xff0c;启动容器默认启用了 ssl 安全传输配置&#xff0c;但是在 Rancher 中部署的话&#xff0c;需要挂载 pvc 实现 data、logs 等目录持久化&#xff0c;启用 ssl 需要对证书等进行操作&#xff0c;非常麻烦&#xff0c;非常坑。 本文以启…
最新文章