
文档教程【免费下载链接】TypeScriptTypeScript 使用手册中文版翻译。http://www.typescriptlang.org项目地址https://gitcode.com/gh_mirrors/typ/TypeScript点击查看免费下载TypeScript 2.8 引入了若干破坏性变更主要涉及编译器错误检查规则的调整未使用类型参数的报错位置迁移以及内置 DOM 库lib.d.ts向 Web 标准的对齐删除 Microsoft 专用类型、移除HTMLObjectElement.alt属性。本文以 zh/breaking-changes/typescript-2.8.md 为骨架逐条剖析这些变更的触发场景、影响范围与迁移方案帮助升级 TypeScript 2.8 及以后版本的开发者快速定位报错并完成修复。变更总览TypeScript 2.8 的破坏性变更集中在两条主线错误检查归属调整未使用的类型参数从--noUnusedLocals的管辖范围迁移到--noUnusedParameters收紧了对泛型函数/类中声明了但从未使用的类型参数的检查。DOM 类型库lib.d.ts标准化删除了一批 Microsoft 专用MS*前缀的 DOM 类型并依据 WHATWG 标准移除了HTMLObjectElement上的alt属性。这两类变更的共同特点是不会影响绝大多数正常代码但会暴露此前被宽松检查掩盖的问题或在启用严格检查选项时产生新的编译错误。下文分别说明。变更一未使用的类型参数改由--noUnusedParameters检查变更内容在 TypeScript 2.8 之前未使用的类型参数unused type parameters在--noUnusedLocals选项下被报告自 2.8 起这类错误改由--noUnusedParameters选项报告对应上游 issue #20568。两个编译选项在 TypeScript 编译器选项表中的定义如下见 zh/project-config/compiler-options.md选项类型默认值说明--noUnusedLocalsbooleanfalse若有未使用的局部变量则抛错。--noUnusedParametersbooleanfalse若有未使用的参数则抛错。此前类型参数被归类为局部声明因此归--noUnusedLocals管辖而类型参数本质上更接近函数的参数因此 2.8 将其划归--noUnusedParameters。这意味着仅开启--noUnusedLocals、未开启--noUnusedParameters的项目升级后不会再收到类型参数未使用的报错同时开启两个选项的项目报错位置不变但错误归属发生了变化错误信息对应的选项不同。触发示例以下泛型函数声明了一个从未参与类型推断、也未被使用的类型参数Tfunction fT() { // T 从未被使用 }在--noUnusedParameters开启时T会被标记为未使用并抛出类似T is declared but its value is never read.的错误。迁移与修复建议修复方式通常是移除未使用的类型参数或让类型参数真正参与约束// 修复 1删除未使用的类型参数 function f() { // ... } // 修复 2让类型参数参与签名 function fT(value: T): T { return value; }如果类型参数是公共 API 的一部分例如为了保持函数签名向后兼容而保留可以像处理未使用的普通参数一样在参数名这里是类型参数名前加下划线前缀_以显式声明有意不使用。相关背景TypeScript 2.6 已经对未使用的判定做了收紧只有被读取read的值才算使用仅被赋值write-only的变量/属性同样会报未使用见 zh/breaking-changes/typescript-2.6.md。2.8 的这次调整是同一检查体系内的归属优化建议开启--noUnusedLocals和--noUnusedParameters时对泛型代码做一次全面回归确认没有依赖旧规则漏报的类型参数。变更二从lib.d.ts删除 Microsoft 专用类型变更内容为了与浏览器标准更好地对齐TypeScript 2.8 从 DOM 定义lib.dom.d.ts等内置库中删除了一批 Microsoft 专用的类型。被删除的完整清单共 13 个MSAppMSAppAsyncOperationMSAppAsyncOperationEventMapMSBaseReaderMSBaseReaderEventMapMSExecAtPriorityFunctionCallbackMSHTMLWebViewElementMSManipulationEventMSRangeCollectionMSSiteModeEventMSUnsafeFunctionCallbackMSWebViewAsyncOperationMSWebViewAsyncOperationEventMapMSWebViewSettings影响范围与对策这些MS*类型对应的是旧版 Microsoft 专有 Web API如MSHTMLWebViewElement、MSWebViewSettings等属于 IE / 旧版 Edge 及 WebView 控件时代的遗留产物。删除后引用这些类型的代码会产生Cannot find name MSApp之类的编译错误以这些类型作为属性类型的接口如MSAppAsyncOperationEventMap、MSBaseReaderEventMap一并失效。对于必须继续使用这些 API 的遗留项目有两条出路改用标准替代 API多数MS*API 在标准浏览器中都有对应实现优先迁移到标准写法自行补充声明如果确实需要这些类型可在项目的全局声明文件.d.ts中按需重建例如// ms-legacy.d.ts interface MSApp { // 按实际用到的成员补充 execAtPriority(callback: MSExecAtPriorityFunctionCallback, priority: number, args: any[]): void; }注意自行补充声明属于项目层面的回到旧世界与 TypeScript 持续向标准对齐的方向相悖应仅作为过渡手段不建议长期依赖。变更三HTMLObjectElement不再具有alt属性变更内容依据 WHATWG 标准对应上游 issue #21386TypeScript 2.8 更新了 DOM 库HTMLObjectElement接口上的alt属性被移除。HTMLObjectElement对应object元素此前 TypeScript 的 DOM 类型声明包含alt: string与 WHATWG 规范不一致因此被删除。此后直接访问objectEl.alt会得到Property alt does not exist on type HTMLObjectElement.的编译错误。通过接口合并恢复alt属性如果项目仍需要继续使用alt属性原文档给出的官方建议是利用**声明合并declaration merging**机制在全局作用域中重新打开reopenHTMLObjectElement接口// 必须位于全局 .ts 文件或 declare global 块中。 interface HTMLObjectElement { alt: string; }这段代码之所以可行依赖的是 TypeScript 的两条语言特性接口合并同名的接口声明会被编译器合并为单一声明合并后的接口同时拥有双方的成员。这是最简单也最常见的声明合并类型见 zh/reference/declaration-merging.md。因此上述声明会与lib.dom.d.ts中内置的HTMLObjectElement合并重新为它加上alt: string。全局作用域声明在模块文件含import/export的文件中需要通过declare global { ... }块把声明注入全局作用域才能与内置的全局 DOM 接口合并。其用法与限制全局扩展与模块扩展的行为和限制是相同的详见 zh/reference/declaration-merging.md。两种写法的正确位置分别是// 写法 A全局 .ts 文件无 import/export天然处于全局作用域 interface HTMLObjectElement { alt: string; }// 写法 B模块文件内使用 declare global 块 declare global { interface HTMLObjectElement { alt: string; } }注意非函数成员如这里的alt在合并时要求同名成员类型一致这里补声明的alt: string与 2.8 之前内置定义一致可安全合并。升级实践建议针对这三项破坏性变更升级到 TypeScript 2.8 及之后版本时建议按以下顺序排查开启编译选项做全量检查在tsconfig.json中配置noUnusedLocals: true与noUnusedParameters: true重新编译重点观察泛型函数/类产生的类型参数未使用错误逐一删除或重命名带_前缀的类型参数。全局搜索MS*标识符用MSApp、MSHTMLWebViewElement、MSWebView等关键词搜索代码库确认是否有依赖已删除类型的代码按标准替代优先、自定义声明兜底的原则处理。检查object元素相关代码搜索.alt在HTMLObjectElement上的使用按原文档给出的接口合并方案在全局声明文件中恢复或改用其他属性承载语义如title、自定义data-*属性。三项变更中第一项是检查规则迁移第二、三项是内置类型库收缩。三者共同体现了 TypeScript 向标准 Web 生态持续收敛的演进方向更严格的未使用检查、更干净的 DOM 类型、更符合规范的接口定义。相关文档与源码导航破坏性变更原文zh/breaking-changes/typescript-2.8.md编译器选项定义--noUnusedLocals/--noUnusedParameterszh/project-config/compiler-options.md接口合并机制详解zh/reference/declaration-merging.md全局作用域扩展declare global用法zh/reference/declaration-merging.md同系列未使用检查收紧变更2.6zh/breaking-changes/typescript-2.6.md全部破坏性变更索引zh/breaking-changes/README.md赞分享文档教程【免费下载链接】TypeScriptTypeScript 使用手册中文版翻译。http://www.typescriptlang.org项目地址https://gitcode.com/gh_mirrors/typ/TypeScript点击查看免费下载相关推荐TypeScript 3.2 破坏性变更详解lib.d.ts 中的 wheelDelta 移除与更精确的 DOM 类型TypeScript 3.2 破坏性变更详解 lib.d.ts 中的 wheelDelta 移除与更精确的 DOM 类型 TypeScript 3.2 对内置文档教程TypeScript 1.5 破坏性变更全解析从 arguments 限制到 DOM 标准化的升级迁移指南TypeScript 1.5 破坏性变更全解析从 arguments 限制到 DOM 标准化的升级迁移指南 TypeScript 1.5 是编译器行为发生重大文档教程GPT4All TypeScript 绑定 v4 破坏性变更EmbeddingResult 与移除的类型如何迁移GPT4All TypeScript 绑定 v4 破坏性变更EmbeddingResult 与移除的类型如何迁移 如果你用 Node.js / TypeScr人工智能大模型本地部署AI 应用桌面应用RAG微调上一篇Sandboxie Classic 源码编译指南基于 Visual Studio 2022 从零构建沙箱核心套件下一篇如何快速掌握 MoonjitLua 即时编译器的完整实践指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考