由于 TypeScript 团队正全力投入下一代 TS 编译器(v7.0,Go 原生重写)的开发,原定 7 月 22 日发布的 5.9 版本延期至 8 月 1 日。
虽迟但到,TypeScript 5.9 已正式上线。这一版本没有引入惊天动地的功能,但在模块系统、编辑器体验、默认配置等方面做了不少贴心优化,让我们这些日常用 TS 的开发者写得更顺、更省心。
更现代的 tsc --init
还记得以前执行 tsc --init
生成的 tsconfig.json
吗?几百行的注释,看得人眼花缭乱,删都删不完。TypeScript 5.9 对此下了狠手——大幅瘦身,只保留了核心配置项,足够现代、也足够实用。
默认生成的配置如下(删去了不必要的注释和冗余):
整体感觉是: 开箱即用,不再啰嗦。新手能快速上手,老手也少了删配置的烦恼。
全新模块语法:import defer
这是 5.9 中最具探索性的新增语法,基于 ECMAScript 的提案实现了一种“懒加载模块”的方式。
import defer * as logger from './logger.js';
console.log('程序开始');
// logger.js 在这一刻才真正加载并执行
logger.log('这是一条日志:前端充电宝nb');
这意味着什么?模块的副作用代码(比如在顶层输出日志、读取文件等)不会一上来就跑,只有你访问它的某个成员时才触发。这对「有副作用但不一定用到」的工具模块尤其友好。
使用限制:
- 只能在
--module esnext
下启用 - 仅支持命名空间形式:
import defer * as foo
,不支持默认导入
举个例子: 假设你有个只在开发时才用的调试工具模块:
if (process.env.NODE_ENV === "development") {
const { inspect } = await import("./debug-tools.js");
inspect(data);
}
可以换成更清爽的写法:
import defer * as debugTools from './debug-tools.js';
if (process.env.NODE_ENV === 'development') {
debugTools.inspect(data);
}
优点显而易见:
- 逻辑直观,不再需要动态
import
。 - 生产环境下不会提前加载该模块,提升性能。
新模块目标 node20
随着 Node.js 的模块解析机制日趋复杂,TypeScript 也推出了新的模块目标:node20
。
这个选项的作用是让 TS 编译器更好地模拟 Node.js 20 的行为,并避免受未来 Node 版本影响。简单来说,就是「锁定」当前的行为,写起来更安心:
{
"compilerOptions": {
"module": "node20",
"moduleResolution": "node20"
}
}
对比 nodenext
,node20
更稳定、保守:
- 不追踪 Node 的后续模块变动。
- 默认 target 为
es2023
,避免过度前沿特性。 - 对模块路径和扩展名的要求更严格,有利于避免“能跑不能构建”的尴尬。
类型提示更聪明了
写 TS 的人应该都被 VS Code 的类型提示“吓”过:一 hover,提示框铺满一整页,复杂嵌套类型压得喘不过气。
现在不一样了,TypeScript 5.9 对这块做了显著提升:
- 类型结构支持折叠/展开
- 默认展示更清晰简洁
- 可以自定义提示长度(配置项:
js/ts.hover.maximumLength
)
来看个简单例子:
在 VS Code 里将鼠标悬停在 options
上,5.9 版本会显示这样的内容:
点击 +
,才展开完整结构。这在大项目、深层嵌套的类型系统里,真的省眼又高效。
性能优化与 bug 修复
虽然不是重头戏,但这部分更新依然值得一提:
- 大型项目首次打开更快,编辑器响应更流畅
- 修复了
AbortSignal.abort()
类型缺失问题 - 改进 JSX 工程的模块处理逻辑
- 类型缩减逻辑更严谨,解决一些边缘 bug
总结一下
TypeScript 5.9 没有大张旗鼓,但每一处改进都很实用:
- 项目初始化更轻巧现代
- 模块加载更智能灵活
- 类型提示更易读可控
- 模块目标更稳定可靠
对于日常开发者来说,写起 TypeScript 来会更顺手、更安心,也更有「这工具懂我」的感觉。