今日要闻
打破信息壁垒,走近全球前端。Hello World 大家好,我是林语冰。
TypeScript 团队官宣,TypeScript v6.0 主版本正式发布,这也是基于 JavaScript 实现的最后一个主版本。
TypeScript v7 开始,TypeScript 将正式移植到 Go 语言,利用原生代码和共享内存多线程提升性能。目前,我们已经可以通过 VS Code 扩展或 npm 手动安装,抢先体验 TypeScript-Go 原生预览版了。
TypeScript v6 是主版本更新,所以此版本会涵盖新功能支持和破坏性更新,主要用于当前版本和基于 Go 语言版本的过渡。换而言之,如果你的项目能顺利迁移到 v6,未来迁移到 v7 的阻力也会更小。
JS 新功能支持
TypeScript v6 新增了 3 个最新的 JS 新功能,所以当我们使用这些新功能时,现在也能获得良好的类型提示。
Map 新方法
来看一段简单的 Vite 源码:
// Vite 源码
if (!hmrClient.dataMap.has(ownerPath)) {
hmrClient.dataMap.set(ownerPath, {});
}
hmrClient.hotModulesMap.get(ownerPath);
这是一种常见的 Map 模式,先判断某个键是否存在,如果有就取值,没有就设置并读取默认值。
针对这种无聊的使用场景,Map 数据结构新增了 2 个实例方法,用于快速判断和设置某个键的默认值:
map.getOrInsert()map.getOrInsertComputed()
我们使用 Map 新方法重构一下 Vite 源码:
hmrClient.hotModulesMap.getOrInsert(ownerPath, {});
这基本上是一个更精简的“方法糖“,一行代码消灭样板代码,更符合人体工程学。
Temporal API
日期和时间一直是 JS 开发中的痛点之一,过去我们经常借助 Moment.js 之类的工具库来改善开发体验。
新出的 Temporal API 被设计来取代 Date 对象,支持多种场景的日期和时间管理,无需安装依赖。
一个计算今天和明天的简单例子:
// 今天
let today = Temporal.Now.instant();
// 24 小时后的明天
let tomorrow = today.add({ hours: 24 });
console.log(`Today: ${today}`);
// Today: 2026-03-25T14:12:53.760909912Z
console.log(`Tomorrow: ${tomorrow}`);
// Tomorrow: 2026-03-26T14:12:53.760909912Z
此外,还有 RegExp.escape() 静态方法,用于保留字符串在构造正则时的字面量行为,这是 ES2025 的旧功能,示例就略过了。
这三大 JS 功能必知必会,最晚的功能今年也会正式发布,建议先学为敬!
项目更新
tsconfig.json 文件中,一些配置选项的默认值修改了。
编译选项现在默认启用严格的类型检查,不需要显式设置;"types": [] 默认为空数组,防止构建时无意包含多余的声明文件,你可以按需添加类型声明文件;如果你不介意自动加载所有声明文件,可以使用 "types": ["*"]。
三种常见情况如下,任选其一:
{
// 保留旧版行为,全部自动包含
"types": ["*"],
// 默认值
"types": [],
// 也可以像 Vite 源码一样,
// 按需添加声明文件
"types": ["node"]
}
lib 库声明也有所改动,dom 库现在包含了 dom.iterable 和 dom.asynciterable 两个声明文件,所以可以简化配置。
{
// v6 之前:
"lib": ["dom", "dom.iterable", "dom.asynciterable"],
// v6:
"lib": ["dom"]
}
编译目标默认为当年的 ECMAScript 版本,比如现在是 ES2025,根据年份和最新标准自动更新。
默认的模块系统为 ESNext,也就是下一代的 ESM 模块,这不仅支持广为人知的 ES6 import 语句,还支持最新的导入属性等标准功能,弃用导入断言等过时语法;esModuleInterop 现在始终启用,让 ESM 和 CJS 的交互更安全。
// v6 之前:
import * as express from "express";
// 导入断言
import data from "./data.json" asserts { type: "json" };
// v6: esModuleInterop 启用
import express from "express";
// 导入属性
import data from "./data.json" with { type: "json" };
出于篇幅考虑,更完整的升级建议阅读官方文档最为妥当。
为了方便上手和学习,我把几个重要的默认配置总结到了这个配置中。
{
"compilerOptions": {
"strict": true,
"target": "ES2025",
"module": "ESNext",
"esModuleInterop": true,
"types": [],
"rootDir": ".",
},
}
这意味着,这些选项现在不需要我们自己配置也会启用了。可以看到,这些默认配置的改动基本上为了容易迁移到 TypeScript v7,拥抱现代化的前端工程。
其他更新
TypeScript v6 还新增了 Node 20 的新功能,支持 #/ 开头的子路径导入,要求配置 --moduleResolution 为 nodenext 或 bundler。
此外,TypeScript v6 的类型系统也有微妙的更新,比如没有 this 的方法不当做上下文敏感处理,引入--stableTypeOrdering Flag 对齐 TypeScript 7 的行为。
这些类型系统的技术细节比较复杂,本文不再一一展开,官方文档解释得很清楚,我读了三遍基本已经能看懂了。
破坏性更新
TypeScript v6 也弃用了一些过时的技术,或者不兼容 v7 的功能。
TypeScript v6 弃用了非主流的模块格式,包括 amd / umd / systemjs,因为后 ES6 时代的模块系统优先使用原生 ESM,偶尔使用 CJS。
同理,--moduleResolution 弃用 node / node10 和 classic,Node 10 和经典的两种模块解析算法早已过时。
v6 还弃用了 ES5,最低输出版本要求至少是 ES2015,因为 IE 浏览器退役之后,现代浏览器基本都支持 ES6,ES5 市场份额几乎为零。
同理,--downlevelIteration 被弃用,因为这个配置主要用于将 ES6 的迭代器优雅降级到 ES5。ES5 和 IE 都无了,还要它做什么。
此外,v6 要求始终启用 --alwaysStrict true,因为 TypeScript v6 假设所有代码都开启 "use strict",因为现代 JS 开发基本会启用“阉割模式“,阉割掉那些乱七八糟的 JS 怪癖。
特别鸣谢
总体而言,TypeScript v6 主要做了两方面的工作,一个是新增一些 JS 的新功能,同步最新的 JS 标准;二是提供一个过渡版本,让用户未来迁移到基于 Go 原生版本的阻力最小化,提前对齐 v7 的部分行为。
TypeScript v6 是一个主版本更新,包含新功能和破坏性更新,整体目的旨在简化配置,提前适应现代化的 JavaScript 开发环境,为迁移 v7 奠定基础。
以上就是今日“前端快讯“的全部内容了,感谢大家按赞跟转发分享本文,你的手动支持是我坚持创作的不竭动力喔。
已经关注我的粉丝们,我们下期再见啦,掰掰~~
参考文献
TypeScript v6 官方博客:devblogs.microsoft.com/typescript/…