找回密码
 加入怎通
查看: 240|回复: 1

TypeScript 5.0 现已发布:全新的装饰器,速度、内存和包大小优化_typescript最新版本

[复制链接]
我来看看 发表于 2023-03-29 02:14:37 | 显示全部楼层 |阅读模式
. d6 p2 v& A x! l

原标题:TypeScript 5.0 现已发布:全新的装饰器,速度、内存和包大小优化作者 | Oghenevwede Emeni,Peng Cao 译者 | 核子可乐 策划 | 丁晓昀 微软在上周发布了 Type 5.0 beta 版本,希望在助其瘦身之余简化使用方式、加快运行速度。

( W8 B6 h5 g8 }' w; K- N6 `

此次公布的 beta 版还引入新的装饰器标准,使用户能够以可重用的方式自定义类及其成员相对于 Type 4.9 在速度和大小方面的提升:

3 G; L- Y. k9 k8 [8 x4 d

此次 beta 版的一大亮点,在于合并了新的装饰器标准,使用户能够以可重用的方式自定义类及其成员Type 项目经理 Daniel Rosenwasser 最近在官方博客上写道,这些实验性的装饰器非常重要,在支持旧版本装饰器的同时将可选编译器标志—experimentalDecorators 设为始终启用。

$ T( ?2 @6 J* T0 t5 I! h

Rosenwasser 表示,很多一直在用 --experimentalDecorators 的开发者已经意识到,之前在 Type 中使用装饰器却不启用此标志,均会产生错误消息Rosenwasser 还谈到 Type 中关于 enums 的老问题,5.0 beta 版如何解决其中部分问题,同时减少了声明各类 enums 时所需理解的概念数量。

: {6 H8 }8 {% i8 ] J0 K3 z9 U

Type 属于开源编程语言加 Java 的一个超集,以 Java 为基础并实现了功能扩展,目前由微软负责开发和维护Type 5.0 中的新装饰器提案允许开发者编写出更清晰、更易于维护的代码,并能够以可重用的方式自定义类及其成员。

2 d% g( a' v" ~) y

虽然新的装饰器与 --emitDecoratorMetadata 不兼容且不支持参数装饰,但微软预计后续推出的 ECMA 提案有望解决这些限制除了新的装饰器提案之外,Type 5.0 还引入多项改进,例如对构造函数中的参数装饰器进行更精确的类型检查、const 注释,以及允许 extends 字段获取多个条目的能力等。

3 l, h: P3 ~' t5 P

Type 5.0 版本还提供新的模块解析选项、性能增强和更详尽的 switch/case 补全功能Type 以 ECMA 2018 为目标,因此 Node.js 用户至少需要使用 Node.js 10 或更高的版本。

2 P4 m$ g* h) i" c" }

要使用此 beta 版本,可以通过 NuGet 或者以下 npm 命令获取:npminstall type@betaType 5.0 新功能与改进快速演示这里我们具体探究一些新功能,并通过代码示例帮助大家开启 Type 5.0 之旅。

. s! }* a' e! g( t1 Y* X' E# Q. E

1. 所有 Enums 均为 union enumsType 5.0 引入一项新功能,其中所有 enum 均为 union enum这意味着每个 enum 成员现在都有自己的唯一类型,即使是由函数调用初始化的也不例外。

5 v$ Y+ c- X0 ^' C. O, I) K* F% E

以往,如果是通过函数调用初始化的 enum 成员,则 Type 会使用旧的 enum 策略并导致 union 和字面量类型的优势失效在新功能的支持下,开发者现可缩小所有 enum 范围,并将其成员作为类型来引用。

3 y- `1 z- y- F5 |

enum E {A = a,B = b,C = Math.random() > 0.5 ? c: d}typeEKeys = keyof typeof E; // A| B| CtypeEValues = typeof E[keyof typeof E]; //

5 u8 j3 T% h1 t) e- E9 V6 d

a| b| c| dfunctionf(e: E) {switch (e) {caseE.A:// This block is only executed if`e` is `a`break;caseE.B:

$ ]7 V! T! s8 ^

// This block is only executed if`e` is `b`break;caseE.C:// This block is only executed if`e` is either `

3 |! t" L: Y6 |4 q+ U5 }

c` or `d`break;}}在以上示例中,enum E 具有 3 个成员,其中 E.C 使用函数调用通过三元运算符进行初始化借助 Type 5.0 中的新功能,所有 enum 成员都拥有自己的独特类型。

; D8 T0 H, ?# @# T" X2 T

在这里,E.C 具有’c’ | d’类型,而不再像旧版本中那样具有 string 类型f 函数则使用 switch 语句将 e 的类型缩小为 enum 成员之一,从而实现更好的类型检查和推断2. 从构造函数推断类属性

/ V. z3 N8 K1 Y- J

Type 5.0 引入了将 const 修饰符添加至类型参数声明的功能,也就是默认做 const-like 推断这项功能非常适合那些需要具体类型,而 Type 已经推断出较通用类型的场景以往,为了实现 const-like 推断,开发者需要在某些位置添加“as const”。

; d+ Z3 `: ~; e+ U7 U# U

Const 修饰符会影响调用中编写的对象、数组和原始表达式的推断,但不会拒绝可变值、或者说需要不可变约束因此,开发者必须牢记 const 修饰符的行为以确保正确使用typeHasNames = { readonly

, ^; a1 J) j5 z$ u% i8 k- u# Z

names: string[] };functiongetNamesExactly(arg: T): T[names] {returnarg.names;

6 {# W& _" z7 t

}// Inferred type: readonly["Alice", "Bob", "Eve"]const names = getNamesExactly({ names: ["Alice", "Bob"

. g1 J1 o/ ~. Q2 U% \& V* {

, "Eve"] } as const);在此示例中,我们定义了一个泛型函数 getNamesExactly,它会接受用于扩展 HasNames 接口的类型 T 的一条参数,其中包含作为 names 属性的字符串数组。

$ o# I( b+ ?' V P6 h

在 Type 5.0 之前,arg.names 的推断类型为 string[],但如果我们需要的是 readonly string[],则需要在调用函数时使用 as const 进行断言而在 Type 5.0 中,我们可以将 const 修饰符添加至类型参数声明当中,借此默认进行 const-like 推断。

$ V& }2 g( P7 m: m( F

这样就能在调用中省略 as const 断言,且仍然推断出更具体的 readonly string[] 类型3. 详尽的 switch/case 补全在编写 switch 语句时,Type 现在可以检测被检查的值是否具有字面类型。

4 V1 r' l4 v$ @

如果是,则通过补全对每个未发现的 case 做 scaffold out

Y' Y& F7 w! m* Y

可以在 GitHub 上(https://github.com/microsoft/Type/pull/50996)参阅具体实现4. 支持 export type *Type 5.0 提供新的“导出类型。

, {2 w' ?- K. u

”功能,能够在重新导出的语句中添加对仅类型导入的支持,例如 export from “module” 和 export * as ns from “module”示例为从 vehicles.ts 模块导出的 Spaceship 类,之后使用 export type * as vehicles from "./vehicles"在 models/index.ts 模块中进行重新导出。

) o8 V/ T& x z

在 main.ts 当中,重新导出的 vehicles 命名空间被导入,并用于对 takeASpaceship 函数中的参数进行类型检查但请注意,在 makeASpaceship 函数中创建新的 Spaceship 对象会导致错误,因为 vehicles 命名空间是作为仅类型导入进行导出的,不可用作值。

5 M9 b$ Z- b$ J9 A

// models/vehicles.tsexportclassSpaceship{// ...}// models/index.tsexporttype * asvehicles from"./vehicles"

B: s, a% a" ^) V$ m, t) R

;// main.tsimport{ vehicles } from"./models";functiontakeASpaceship(s: vehicles.Spaceship) {// ok - `vehicles` only used in a type position

5 ^5 l; z" s- W# r. s f, M1 e

}functionmakeASpaceship() {returnnewvehicles.Spaceship(); // Error: vehicles cannot be used as a value because it was exported using export type.

/ I5 @5 l, z" N+ Q

}5. 多配置扩展Type 5.0 现可支持使用 extends 字段扩展多个配置文件这项功能适用于同时管理多个项目,其中“基本”配置文件可由其他 tsconfig.json 文件进行创建和扩展以往,这项操作只能通过单个文件完成,但现在您可以扩展至多个文件,并在发生字段冲突时以后一个条目为优先。

/ s( a; e d6 n o

例如,如果您有一个从 @tsconfig/strictest/tsconfig.json 扩展的基本 sconfig.base.json 文件,则可以让其他 tsconfig.json 文件从这两个文件进一步扩展,如下所示:

& ~1 i: I1 J8 T. O$ n

{"extends": ["@tsconfig/strictest/tsconfig.json", "../../../tsconfig.base.json"],"compilerOptions": {

/ \5 v% G3 u# w% `! Z7 O$ k3 n e# B# R

"outDir": "../lib",// ...}}这就为多个配置文件的管理带来更大的灵活性,可通过多个文件扩展并轻松控制字段优先级6. 性能提升Type 5.0 提供多项性能改进,包括更快的对象类型索引和经过优化的条件类型推断。

4 r/ M6 y$ l' p9 V6 t0 x8 }

以上只是 Type 5.0 的部分新功能与改进,请参阅官方公告页面以了解更多详细信息参考链接:https://www.infoq.com/news/2023/03/announcing-Type-5-beta/。

# H7 w0 A) {% h! h4 `" r3 W: B% _2 Z& o

https://medium.com/@caopengau/type-5-0-a-quick-demo-of-new-features-and-improvements-fbb841728ea相关阅读:

" _2 D D Y# C, o( C

20 个大前端必知领域之「Type」(https://www.infoq.cn/article/Xkg8kQ5weTgGm8CltxNZ)Type 与 Java:你应该知道的区别 (https://xie.infoq.cn/article/6ff79700fb3bfa972c1beebf3

: U# N* h& C4 R" m$ A, ^

)系统学习 Type(一)——认识 Type(https://xie.infoq.cn/article/4e88dfe234519e435a8cd9183)未来可期的 Type(https://www.infoq.cn/article/UJi4x9fUcaw9fCJ52o8i

9 \2 L+ Z! e# z+ p

)声明:本文为 InfoQ 翻译,未经许可禁止转载点击底部阅读原文访问 InfoQ 官网,获取更多精彩内容!今日好文推荐可悲的现实,大部分技术领导者可能并不称职百度回应文心一言“套壳”质疑;TikTok在美经历生死时刻;IT外包行业面临最大规模裁员,埃森哲将暴力裁员1.9万人 | Q资讯。

' L/ z" A- d: E9 o. q' x& r; `0 X

集成GPT-4的编程神器来了,GitHub发布Copilot X:编程30年,突然就不需要手敲代码了?!八年“老网红”Flink:揭秘实时流计算引擎全球化落地的演进历程返回搜狐,查看更多责任编辑:

! A/ N3 e5 ]9 u% x7 `4 d( k$ q $ D, d& W5 g( u; |8 E $ f, u! \8 X1 {. L& x& K- B x A 0 U6 g! B: Z; I H8 Y- e- {% f3 q+ F* p9 g0 t
回复

使用道具 举报

shally 发表于 2026-03-14 16:44:52 | 显示全部楼层
内容很干货,没有多余的废话,值得反复看
回复 支持 反对

使用道具 举报

    您需要登录后才可以回帖 登录 | 加入怎通

    本版积分规则

    QQ|手机版|小黑屋|网站地图|真牛社区 ( 苏ICP备2023040716号-2 )

    GMT+8, 2026-6-15 00:52 , Processed in 0.023670 second(s), 23 queries , Gzip On.

    免责声明:本站信息来自互联网,本站不对其内容真实性负责,如有侵权等情况请联系420897364#qq.com(把#换成@)删除。

    Powered by Discuz! X3.5

    快速回复 返回顶部 返回列表