以下是 TypeScript 5.8 官方发布说明的中文整理,重点列出新特性和修复的 Bug:
新特性
1. 返回表达式中的分支细粒度检查
- 在
return
语句中的条件表达式(如三元运算符? :
)会直接检查每个分支是否符合函数的返回类型。 - 示例:
declare const untypedCache: Map<any, any>; function getUrlObject(urlString: string): URL {return untypedCache.has(urlString) ?untypedCache.get(urlString) : // 分支1: anyurlString; // 分支2: string → 报错(无法赋值给 `URL`) }
2. --module nodenext
支持 require()
导入 ECMAScript 模块
- Node.js 22 允许从 CommonJS 模块
require()
导入 ESM 模块(不含顶层await
的 ESM 文件)。 - TypeScript 5.8 在
--module nodenext
下不再报错此类导入。
3. 新增 --module node18
编译选项
- 为 Node.js 18 提供稳定的模块解析规则:
- 禁止
require()
导入 ESM 模块。 - 允许已弃用的
import
断言语法(assert
)。
- 禁止
4. --erasableSyntaxOnly
选项
- 启用后,禁止包含运行时语义的 TypeScript 语法(如
enum
、带运行时代码的命名空间等),确保代码可被擦除为纯 JavaScript。 - 示例:
class C {constructor(public x: number) {} // 报错:参数属性(`public x`)不可用 }
5. --libReplacement
标志
- 控制是否允许通过
@typescript/lib-*
替换默认的lib
类型定义(默认行为可能未来禁用,建议显式配置)。
6. 声明文件中保留计算属性名称
- 生成
.d.ts
文件时,保留计算属性名称的原始变量名(如[propName]
而非[x: string]
)。 - 示例:
export let propName = "theAnswer"; export class MyClass {[propName]: number; // 声明文件保留 `[propName]` 而非 `[x: string]` }
7. 程序加载与更新的性能优化
- 减少路径规范化时的数组分配。
- 避免在无结构变化的编辑中重新验证项目配置(提升
--watch
和编辑器响应速度)。
重要 Bug 修复
1. import
断言语法限制
- 在
--module nodenext
下,弃用assert
语法,强制使用with
关键字(Node.js 22 已不再支持assert
)。 - 示例:
import data from "./data.json" assert { type: "json" }; // 报错:需改用 `with`
2. lib.d.ts
更新引发的类型检查影响
- 更新了 DOM 类型定义,可能影响现有代码的类型检查(需检查相关类型兼容性)。
3. 路径大小写敏感性问题修复
- 修复 Windows 系统上因路径大小写不一致导致的模块解析失败问题。
4. 声明文件生成兼容性问题
- TypeScript 5.8 生成的声明文件可能不兼容旧版本(如 5.7 及更早版本)。
其他改进
1. 错误消息优化
- 对模板字符串类型不匹配等错误提供更清晰的提示。
2. 编辑器体验提升
- VS Code 的自动导入和代码补全更精准。
3. 实验性语法支持
- 解析
import attributes
提案语法(需运行时支持):import data from "./data.json" with { type: "json" };
未来计划
- TypeScript 5.9 将包含进一步改进(如条件返回类型的增强检查)。
- 可通过
npm install typescript@next
提前体验夜间构建版本。
完整内容详见 TypeScript 5.8 官方说明。