TypeScript 超实用的新功能来了

由于 TypeScript 团队正全力投入下一代 TS 编译器(v7.0,Go 原生重写)的开发,原定 7 月 22 日发布的 5.9 版本延期至 8 月 1 日。

虽迟但到,TypeScript 5.9 已正式上线。这一版本没有引入惊天动地的功能,但在模块系统、编辑器体验、默认配置等方面做了不少贴心优化,让我们这些日常用 TS 的开发者写得更顺、更省心。

更现代的 tsc --init

还记得以前执行 tsc --init 生成的 tsconfig.json 吗?几百行的注释,看得人眼花缭乱,删都删不完。TypeScript 5.9 对此下了狠手——大幅瘦身,只保留了核心配置项,足够现代、也足够实用。

默认生成的配置如下(删去了不必要的注释和冗余):

Image

整体感觉是: 开箱即用,不再啰嗦。新手能快速上手,老手也少了删配置的烦恼。

全新模块语法:import defer

这是 5.9 中最具探索性的新增语法,基于 ECMAScript 的提案实现了一种“懒加载模块”的方式。

提案:https://github.com/tc39/proposal-defer-import-eval/

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

对比 nodenextnode20 更稳定、保守:

  • 不追踪 Node 的后续模块变动。
  • 默认 target 为  es2023,避免过度前沿特性。
  • 对模块路径和扩展名的要求更严格,有利于避免“能跑不能构建”的尴尬。

类型提示更聪明了

写 TS 的人应该都被 VS Code 的类型提示“吓”过:一 hover,提示框铺满一整页,复杂嵌套类型压得喘不过气。

现在不一样了,TypeScript 5.9 对这块做了显著提升:

  • 类型结构支持折叠/展开
  • 默认展示更清晰简洁
  • 可以自定义提示长度(配置项:js/ts.hover.maximumLength

来看个简单例子:

Image

在 VS Code 里将鼠标悬停在  options  上,5.9 版本会显示这样的内容:

Image

点击 +,才展开完整结构。这在大项目、深层嵌套的类型系统里,真的省眼又高效。

性能优化与 bug 修复

虽然不是重头戏,但这部分更新依然值得一提:

  • 大型项目首次打开更快,编辑器响应更流畅
  • 修复了 AbortSignal.abort() 类型缺失问题
  • 改进 JSX 工程的模块处理逻辑
  • 类型缩减逻辑更严谨,解决一些边缘 bug

总结一下

TypeScript 5.9 没有大张旗鼓,但每一处改进都很实用:

  • 项目初始化更轻巧现代
  • 模块加载更智能灵活
  • 类型提示更易读可控
  • 模块目标更稳定可靠

对于日常开发者来说,写起 TypeScript 来会更顺手、更安心,也更有「这工具懂我」的感觉。