TypeScirpt 4.4 正式发布|Code China

GitCode
企业官方账号
2021-08-30 17:58:36

TypeScript 是一种用于应用程序级 JavaScript 的语言。JavaScript 作为 Java 的补充,旨在用于创建以网络为中心的应用程序,是一种轻量级的解释型编程语言,尽管它很容易实现,但 JavaScript 并不能算做是一个成熟的编程语言,“客户端 JavaScript 不允许读取或写入文件、不能用于网络应用程序、没有任何多线程或多处理器功能”是它最大的短板,由于其自身局限性导致 JavaScript 难以胜任和维护大型项目的开发,TypeScript 从此应运而生。

TypeScript 通过在 JavaScript 的基础上添加静态类型定义构建而成,它可以通过 TypeScript 编译器转译为 JavaScript 代码,可在任何浏览器和操作系统上运行,并且在数据流结构规范性、自编译能力、编译时的强类型、模块化等方面都有不错的表现。

近日,微软官方发布了 TypeScript 4.4 版本,开发者可以通过 NuGet 开始使用或者通过以下命令进行安装:

npm install typescript

本次更新亮点包括:

  • 提供针对 Aliased Conditions 和 Discriminants 的控制流程分析

  • 增加 symbol 类型和模板字符串模式的索引签名

  • 在 Catch 中的变量默认为 unknow 类型(--useUnknownInCatchVariables)

  • 准确的可选属性类型(--exactOptionalPropertyTypes)

  • 静态块类

  • 针对 tsc --help 的更新和改进

  • 性能优化

  • JavaScript 的拼写建议

  • 嵌入提示

  • 重大变化

本文将对大家普遍关心的“性能优化”及“重大变化”两个方面进行详细解读。

性能优化

更快的声明

TypeScript 现在会缓存内部符号在不同上下文中是否可以访问以及特定类型应该如何打印。这些更改可以提高 TypeScript 在具有相当复杂类型代码中的整体性能,尤其是在 declaration 下标记 .d.ts 的文件。

更快的路径规范化

TypeScript 经常需要对文件路径进行几种类型的“规范化”,以使它们成为编译器可以在任何地方都能使用的统一格式。这包括用斜杠替换反斜杠,或者删除中间/./ 和 /../路径段。当 TypeScript 在数百万条路径上运行时,这些操作可能会变得有点慢。在 TypeScript 4.4 中,路径首先要进行快速检查,查看它们是否需要规范化。在大型项目中,这些改进总共减少了 5-10% 的项目加载时间,而在我们内部测试过的大型项目中,这些改进显著地减少了更多的加载时间。

更快的路径映射

TypeScript 现在缓存了它构建路径映射的方式(在tsconfig.json中使用 paths 选项 ),对于具有数百个映射的项目,这种减少是非常显著的。

通过--strict进行更快的增量编译

这实际上是一个 Bug,如果启用了--strictTypeScript 最终会在--incremental编译下重做类型检查工作,这就导致了许多构建就像关闭--incremental 一样缓慢。TypeScript 4.4 修复了这个问题,同时这个修改也被反向移植到了 TypeScript 4.3 中。

针对 Big Ouputs 的更快源映射生成

TypeScript 4.4 为超大输出文件的源映射生成添加了优化功能,在构建旧版本的 TypeScript 编译器时,可使 emit 时间减少 8% 左右。

通过--force进行更快的编译

在项目引用上使用--build模式时,TypeScript 必须执行最新的检查以确定有哪些文件需要重建。但是,在执行--force 构建时,该信息又是无关紧要的,因为每个项目的依赖项都将从头开始构建。在 TypeScript 4.4 中,--force构建避免了那些不必要的步骤然后开始完整构建。

重大变化

对导入函数更兼容的间接调用

在 TypeScript 的早期版本中,调用来自 CommonJS、AMD 和其他 非ES 模块系统的导入会设置被调用函数的this 值。具体来说,在以下示例中,当调用fooModule.foo() 时,foo() 方法将把fooModule 设置为this值。

// Imagine this is our imported module, and it has an export named 'foo'.
let fooModule = {
    foo() {
        console.log(this);
    }
};
​
fooModule.foo();

当我们调用 ECMAScript 导出的函数时,这不是它们应该工作的方式。这就是为什么TypeScript 4.4 会在调用导入函数时使用下面的 emit,会故意丢弃this值。

// Imagine this is our imported module, and it has an export named 'foo'.
let fooModule = {
    foo() {
        console.log(this);
    }
};
​
// Notice we're actually calling '(0, fooModule.foo)' now, which is subtly different.
(0, fooModule.foo)();

在 Catch 变量中使用 unknown

使用--strict标志运行的用户可能会看到关于catch变量unknow的新错误,特别是在现有代码假定只捕获了Error值的情况下。这通常会导致如下错误消息:

Property 'message' does not exist on type 'unknown'.
Property 'name' does not exist on type 'unknown'.
Property 'stack' does not exist on type 'unknown'.

为了解决这个问题,你可以专门添加运行时检查,以确保抛出的类型与期望的类型相匹配。如果不这样的话,你只能使用类型断言,在 catch 变量中添加一个显式的:any,或者关闭-- useUnknownInCatchVariables。

更广泛的“Always-Truthy”承诺检查

在以前的版本中,TypeScript 引入了“Always truth promise check”来捕捉可能被遗忘的await代码;然而,检查只对命名声明有效。这也就意味着,这段代码将正确地接收一个错误……

async function foo(): Promise<boolean> {
    return false;
}
​
async function bar(): Promise<string> {
    const fooResult = foo();
    if (fooResult) {        // <- error! :D
        return "true";
    }
    return "false";
}

但是下面的代码不会

async function foo(): Promise<boolean> {
    return false;
}
​
async function bar(): Promise<string> {
    if (foo()) {            // <- no error :(
        return "true";
    }
    return "false";
}

抽象属性不允许初始化器

以下代码是一个错误,因为抽象属性可能没有初始值设定项:

abstract class C {
    abstract prop = 1;
    //       ~~~~
    // Property 'prop' cannot have an initializer because it is marked abstract.
}

相反,你只能为属性指定一个类型:

abstract class C {
    abstract prop: number;
}

关于 TypeScript 4.4 以上功能的详细信息,请查看官方发布公告。

直接交流,扫码入群:

...全文
758 回复 打赏 收藏 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
内容概要:本文针对基于输入并联输出串联(IPOS)结构的双三相LLC谐振变换器,系统研究其在宽增益工况下的谐振参数优化方法与启动过程中冲击电流的抑制策略。通过Simulink平台构建系统仿真模型,结合变频控制与电压电流双闭环调控策略,深入分析变换器在全范围软开关条件下的工作边界、模式切换动态响应及多模式运行稳定性。研究提出优化谐振腔参数设计以扩展电压增益范围,并引入降频软启动、星形耦合自均流等机制有效抑制上电瞬间的电流冲击,提升系统启动可靠性与运行效率。同时探讨了变频调压、多模式切换控制及交错并联带来的均流优势,为高增益、大功率密度DC-DC变换器的设计提供了完整的建模、控制与优化解决方案; 适合人群:具备电力电子与电力系统基础知识,从事新能源变换器、高频开关电源、电动汽车充电系统、航空航天电源等相关领域研究的研究生、科研人员及工程技术人员; 使用场景及目标:①为高电压增益、高效率、高功率密度DC-DC变换器的谐振参数设计与控制策略制定提供理论依据与仿真验证手段;②指导LLC谐振变换器在新能源并网、车载充电机、直流微网等应用场景中的工程实现与性能优化;③支撑高水平学术论文(如IEEE期刊)的复现、科研项目关键技术攻关及系统级仿真平台搭建; 阅读建议:建议结合Simulink仿真实例,细致理解谐振参数设计准则、软开关实现条件、冲击电流形成机理及其抑制方法的有效性验证过程,重点关注模式切换过程中的动态响应特性与闭环控制参数整定规律,宜配合相关文献进行对比分析以深化对系统稳定性和控制策略优越性的认知。
内容概要:本文详细介绍了使用CAXA3D软件进行支座类零件三维建模的全过程,采用“草图拉伸构建基体→添加凸台→加强筋→切除凹槽与安装孔”的建模思路。通过分步操作讲解,涵盖从创建底座草图、拉伸成实体、添加长方体凸台、使用加强肋图素增强结构强度,到利用孔类图素完成顶部矩形凹槽和中部弧形槽口的切除,最后通过布尔合并形成完整零件。文中还列出了关键尺寸参数,并针对常见建模问题提供了具体解决方案,如长圆孔未切除、加强肋无法生成、孔类图素不减料及零件未合并等问题的原因分析与处理方法。; 适合人群:具备基本三维建模基础,从事机械设计、产品结构设计等相关工作的工程师或工科专业学生;尤其适合正在学习CAXA3D软件操作的初学者; 使用场景及目标:①掌握CAXA3D中基于草图拉伸与图素库组合的高效建模流程;②理解加强肋、孔类图素等智能图素的正确使用方式;③学会解决建模过程中常见的草图封闭性、实体吸附与布尔运算问题;④为后续工程图出图和实际零件设计打下基础; 阅读建议:建议读者结合CAXA3D软件同步实操,按照文档步骤逐步练习,重点关注草图封闭性、图素吸附机制和最终布尔合并的操作细节,以提升建模成功率与效率。
内容概要:本文系统研究了基于直流母线电压外环与电流内环协同调节的飞轮储能网侧变流器并网控制方法,通过Simulink搭建完整的仿真模型,深入剖析双闭环PI控制策略的设计原理与实现过程。重点阐述电压外环维持直流侧电压稳定、电流内环实现并网电流精确跟踪的协同工作机制,详细讨论控制器参数设计、坐标变换(dq变换)、锁相环技术及PWM调制等关键环节,验证该控制方案在动态响应速度、稳态精度和并网电能质量方面的优良性能,适用于飞轮储能参与电网频率调节、功率支撑等实际应用场景。; 适合人群:具备电力电子、自动控制理论及新能源系统基础知识,从事储能系统、电力变换器控制研究的研究生、科研人员及电气工程领域的工程技术人员。; 使用场景及目标:① 掌握飞轮储能系统网侧变流器的并网控制架构与工作原理;② 学习并掌握双闭环PI控制器的设计思路与参数整定方法;③ 借助Simulink仿真平台复现典型控制策略,支撑科研论文撰写、项目开发或教学实践; 阅读建议:建议结合文中提及的相关研究内容(如机侧控制、功率平滑策略等)进行系统性学习,并下载配套仿真资源进行实操演练,通过调整控制器参数、设置不同工况,深入理解系统动态响应特性与控制逻辑的内在联系。

1,273

社区成员

发帖
与我相关
我的任务
社区描述
本社区的主要目的是以分享开源项目的相关知识为主。
其他 其他
社区管理员
  • AtomGit 代码君
  • XianxinMao
  • 茶陵後
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

GitCode能有效的将代码管理与线上练习以及线上评测打通,实现一站式学与练的教学管理环境。

试试用AI创作助手写篇文章吧