TypeScript 5.7 引入了多个新特性和改进,旨在提升开发者体验,并确保代码的可靠性和高效性。此版本重点优化了变量初始化检查、模块导入处理、与 ECMAScript 标准的兼容性等方面。以下是这些更新的详细介绍
增强的变量初始化检查
TypeScript 5.7 改进了对未初始化变量的处理。在之前的版本中,如果变量在嵌套函数中被访问,TypeScript 并不会捕获错误。
在旧版本中,以下代码不会报错:
function example() {
let result: number;
if (someCondition()) {
result = computeValue();
} else {
// 忘记给 'result' 赋值
}
function displayResult() {
console.log(result); // 此处没有错误
}
}
现在,TypeScript 会捕获错误,即使变量在嵌套函数中被访问:function example() {
let result: number;
function displayResult() {
console.log(result); // 错误:变量 'result' 在被赋值之前就被使用。
}
}
此改进确保您的代码更加健壮,减少了潜在的运行时错误。
相对导入路径重写
随着 ts-node、Deno 等工具的流行,开发者常常直接导入 .ts 文件。TypeScript 5.7 引入了新的 --rewriteRelativeImportExtensions 编译选项,以简化这一过程。
在 TypeScript 5.7 之前,当开发者在开发过程中使用 .ts 文件时,编译成 JavaScript 后,往往会出现路径不匹配的问题:
import { helper } from "./helper.ts"; // 开发环境中直接导入 TypeScript 文件
启用此选项后,TypeScript 会在编译过程中自动将 .ts 文件路径重写为 .js 文件路径,避免开发与生产环境间的路径不一致:
// 输入(启用 --rewriteRelativeImportExtensions)
import { helper } from "./helper.ts";
// 输出(编译后)
import { helper } from "./helper.js";
支持 ECMAScript 2024 新特性
TypeScript 5.7 支持 ECMAScript 2024 的新特性,允许开发者利用最新的 JavaScript 功能。
Object.groupBy 和 Map.groupBy 方法,简化对象和 Map 条目的分组。
Promise.withResolvers 提供更好的 promise 控制。
Atomics.waitAsync 从 ES2022 库移至 ES2024。
TypedArrays 现在是对 ArrayBufferLike 的泛型,使其可以与 ArrayBuffer 和 SharedArrayBuffer 一起使用。
示例:
interface Uint8Array<TArrayBuffer extends ArrayBufferLike = ArrayBufferLike> {
// TypedArray 方法和属性
}
通过这些特性,TypeScript 开发者可以更轻松地使用最新的 JavaScript 功能,而无需担心兼容性问题。
优化的项目配置解析
TypeScript 5.7 改进了编辑器(如 Visual Studio Code)如何解析项目配置文件(tsconfig.json)。这一更新确保编辑器可以正确解析项目中多个配置文件。
之前,TypeScript 在打开文件时会在目录层次结构中找到第一个 tsconfig.json 文件后停止搜索,这可能导致错误的项目关联。
现在,TypeScript 会继续在目录树中向上查找,确保找到正确的配置文件。例如:
project/
├── src/
│ ├── app.ts
│ ├── app.test.ts
│ ├── tsconfig.json // 排除测试文件
│ └── tsconfig.test.json // 包含测试文件
└── tsconfig.json // 引用 src 配置
在 TypeScript 5.7 中,当打开 app.test.ts 时,它会正确关联到 src/tsconfig.test.json。
使用 --module nodenext 进行 JSON 导入验证
TypeScript 5.7 对使用 --module nodenext 选项导入 JSON 文件进行了更严格的验证,确保与 Node.js 的 ES 模块标准一致。
import config from "./config.json" assert { type: "json" };
这样可以确保 TypeScript 与 Node.js ES 模块行为一致,避免运行时错误。
支持 V8 编译缓存
TypeScript 5.7 利用 Node.js 22 中的新 module.enableCompileCache() API 来提升 TypeScript 工具的启动性能。
没有缓存时:
node ./built/local/_tsc.js --version
# 时间: ~122ms
启用缓存后:
node ./built/local/tsc.js --version
# 时间: ~48ms
这个新特性特别适用于大型项目,可以显著加快开发流程。
显著的行为变化
TypeScript 5.7 引入了一些可能影响现有代码库的变化,开发者需要注意以下几点:
TypedArrays 现在是泛型:需要更新代码以支持泛型参数。
非字面量方法名的索引签名:TypeScript 现在会为使用动态键(如符号)的类方法生成索引签名。
返回 null 或 undefined 的函数的隐式 any 错误:TypeScript 会报告函数返回 null 或 undefined 时的隐式 any 错误,改进了类型检查。
示例:
declare var promise: Promise<number>;
const result = promise.catch(() => null); // 错误:函数隐式返回了 'any' 类型
结论
TypeScript 5.7 带来了许多令人兴奋的新特性和改进,帮助开发者编写更可靠、高效的代码。通过新的检查、更好的 ECMAScript 兼容性和性能优化,TypeScript 进一步提升了开发体验。开发者应当探索这些新特性,并根据需求调整代码,以充分利用此次发布的改进。
本文首发于公众号“web前端开发之旅”,转载请注明出处!
该文章在 2025/2/11 16:15:15 编辑过