TypeScript 6.0 正式发布,为7.0做准备

摘要:如果你最近没看 TypeScript 团队的消息,可能不知道这版有个特殊的地方。6.0 很可能是最后一个基于现有 JavaScript 代码库的版本。TypeScript 团队正在用 Go 语言重写整个编译器,准备在 7.0 推出。

TypeScript 6.0 发布了。

如果你最近没看 TypeScript 团队的消息,可能不知道这版有个特殊的地方。6.0 很可能是最后一个基于现有 JavaScript 代码库的版本。TypeScript 团队正在用 Go 语言重写整个编译器,准备在 7.0 推出。

所以 6.0 的定位很清楚:一个过渡版本,帮开发者平滑升级到 7.0。但这不意味着 6.0 没什么内容。这次的破坏性更新挺多的,我们一个个来看。


默认值都改了

先说最影响日常开发的部分。tsconfig 里的默认值全换了。

strict 现在默认为 true。之前很多团队会手动开启 strict 来避免踩坑,现在新项目直接默认就是严格模式。如果你有老项目还没开 strict,升级后可能会收到一堆报错。

module 默认变成 esnext。ESM 终于成了默认选项,commonjs 不再是默认值了。

target 默认变成当年的 ES 版本。现在是 es2025,以后会跟着年份自动更新。这意味着大多数情况下你不用再手动指定 target 了。

types 默认变成空数组。这是个需要注意的地方。之前 TypeScript 会自动扫描 node_modules/@types 下的所有包,几百个类型定义全给你塞进去,编译速度会变慢。现在默认不加载任何 @types,需要什么自己明确写出来:

{
  "compilerOptions": {
    "types": ["node", "jest"]
  }
}

TypeScript 官方说这一波改动能让编译速度提升 20% 到 50%。


新特性

Temporal API 终于有类型了

Date 和 DateTime 可以原生使用了:

const yesterday = Temporal.Now.instant().subtract({ hours: 24 });
const tomorrow = Temporal.Now.instant().add({ hours: 24 });

这是个 Stage 4 的提案,TypeScript 6.0 直接内置了类型支持,不用再装 @types/temporal。

Map 新增 getOrInsert

const strict = compilerOptions.getOrInsert("strict", true);

不用先判断 has 再 set 了,一步到位。

Subpath imports 支持 #/

{
  "imports": {
    "#/*": "./dist/*"
  }
}

之前必须写成 #root/ 这种带名字的格式,现在可以直接用 #/ 当前缀。这是 Node.js 20 新增的特性,TypeScript 跟进了。

--stableTypeOrdering

这是个新参数,专门给 6.0 升 7.0 用的。TypeScript 7.0 用 Go 重写后并行检查,类型顺序会变,可能导致声明文件差异很大。这个参数让 6.0 的行为和 7.0 对齐,方便比对。但官方说会导致类型检查慢最多 25%,不建议长期开着。


大量功能被废弃

6.0 到 7.0 之间有很多配置被废弃了:

  • target: es5 废弃,最低变成 es2015

  • --downlevelIteration 废弃

  • --moduleResolution node 废弃,改用 nodenext 或 bundler

  • module: amd/umd/systemjs/none 全部废弃

  • --baseUrl 废弃

  • --outFile 移除

  • module 关键字声明 namespace 废弃,改用 namespace 关键字

  • import ... assert 废弃,改用 import ... with

  • 三斜杠指令 /// 废弃

如果你的项目还在用这些配置,6.0 会报废弃警告,7.0 会直接报错。


怎么升级

官方给了一个叫 ts5to6 的 codemod 工具,可以自动调整 baseUrl 和 rootDir。但大多数情况下你需要手动改 tsconfig。

我的建议是:

  • 新项目直接上 6.0,用默认配置

  • 老项目先别急着升,看看有没有用废弃的配置

  • 用 --strict 跑一遍,看看有多少报错

  • types 里至少加上 ["node"],不然 process、fs 这种全局对象会报找不到


关于 TypeScript 7.0

官方说 7.0 已经“非常接近完成了”,预计今年晚些时候就能见到。用 Go 重写后编译速度据说能快 10 倍,对大型项目来说是好事。

就是以后调试编译器的时候,得从 JavaScript 换成 Go 了。

本文内容仅供个人学习、研究或参考使用,不构成任何形式的决策建议、专业指导或法律依据。未经授权,禁止任何单位或个人以商业售卖、虚假宣传、侵权传播等非学习研究目的使用本文内容。如需分享或转载,请保留原文来源信息,不得篡改、删减内容或侵犯相关权益。感谢您的理解与支持!

链接: https://shenqiku.cn/article/FLY_13596