typescript-eslint 官方变更日志(CHANGELOG)解读:从 8.70.0 到 v1.0.0 的完整演进路线
【免费下载链接】typescript-eslint:sparkles: Monorepo for all the tooling which enables ESLint to support TypeScript项目地址: https://gitcode.com/GitHub_Trending/ty/typescript-eslint
本文是一篇以 typescript-eslint 仓库根目录 CHANGELOG.md 为绝对主体的技术导读。全文完整继承该文件 234 个版本小节的骨架与要点,梳理 v8 → v7 → v6 → v5 → v4 → v3 → v2 → v1 的演进脉络,并对照仓库源码、配置与文档交叉印证。读完本文,你将理解 typescript-eslint 每个大版本的核心变化、破坏性变更的判定标准、monorepo 各包间的协作关系,以及如何借助 CHANGELOG 制定升级与降级策略。
一、CHANGELOG 概览:6571 行、234 个版本的真实数据
仓库根目录的 CHANGELOG.md 是一份自动生成的、按时间倒序排列的发布记录,全文共 6571 行,记录了自 2019 年 1 月 20 日v1.0.0至 2026 年 9 月 7 日8.70.0的全部版本。统计结果如下(来自该文件自身的章节标题):
| 统计项 | 数值 |
|---|---|
| 总行数 | 6571 |
版本小节总数(^##/^#标题) | 234 |
| 最早版本 | 1.0.0 (2019-01-20) |
| 最新版本 | 8.70.0 (2026-09-07) |
| 大版本 | 1.0 → 2.0 → 3.0 → 4.0 → 5.0 → 6.0 → 7.0 → 8.0 |
1.1 每个版本小节的固定结构
除少数大版本外,每个小节遵循统一的模板,本文将其归纳为如下五段式结构:
- 版本标题:形如
## 8.70.0 (2026-09-07),标注发布日期; - 🚀 Features:新功能,例如 8.70.0 新增
no-generated-empty-object-type规则与网站社交预览卡片; - 🩹 Fixes:缺陷修复,例如 8.70.0 对
member-ordering、no-unnecessary-condition、no-deprecated等规则的修复; - ❤️ Thank You:贡献者名单(含 AI 助手署名,如 8.68.0 小节中的
Claude Opus 5、Cursor @cursoragent); - 收尾链接:指向 GitHub Releases 与版本策略/发布说明文档。
1.2 旧版(v6 之前)的格式差异
v6 及更早版本(6.17.0 之前)的标题格式为# 6.17.0 (日期),且分类名使用### Bug Fixes/### Features,而不是 v7/v8 的### 🩹 Fixes。例如 6.14.0 使用了### Bug Fixes与### Features的经典格式。格式的切换发生在 6.17.0(2024-01-01)之后、7.0.0(2024-02-12)之前,即从 v7 系列开始全面采用 emoji 化的分类标题。
1.3 两个特殊的"非标题"大版本:7.0.0 与 8.0.0
在 v6 与 v7 系列之间,存在两个使用#单井号但不带版本号链接的大版本标题:
- 8.0.0 (2024-07-31):仅有一条指向官网公告的迁移指南引用,正文是完整的 Breaking Changes / Features / Fixes 列表;
- 7.0.0 (2024-02-12):结构与 8.0.0 类似,且其中 Breaking Changes 被嵌入 Features 列表内(标注 ⚠️)。
这两个小节是全文最重要的内容载体,也是本文第四、五章深度讲解的对象。
二、版本与发布策略:为什么所有包共用一个版本号
CHANGELOG 末尾反复出现的"versioning strategy"与"releases"链接,对应的正是仓库内 docs/users/Versioning.mdx 一文。结合 CHANGELOG 的发布记录,可以确认以下事实:
2.1 语义化版本与统一版本号
该项目遵循 semver,并且所有包以相同版本号同时发布。这一点从 CHANGELOG 中可以得到直接印证:例如 8.70.0 一节同时涵盖eslint-plugin、project-service、typescript-estree、website等多个包的变更,而非每个包单独记录版本。这种"一把梭"策略简化了 monorepo 各包之间的依赖协调——eslint-plugin、parser、typescript-estree之间用同一个版本号配对,用户在安装时不需要手动对齐版本矩阵。
2.2 破坏性变更的判定标准(与 CHANGELOG 中的 ⚠️ 条目互证)
Versioning.mdx 将破坏性变更按包分组给出了明确清单,这些标准在 CHANGELOG 中都有对应实例:
| 包 | 视为破坏性变更的行为 | CHANGELOG 对应实例 |
|---|---|---|
ast-spec/visitor-keys | 删除/重命名 AST 节点或属性、非细化地改类型 | 8.0.0 中"split TSMappedType typeParameter into constraint and key"(CHANGELOG.md#L2271) |
eslint-plugin | 删除/重命名规则或选项、改默认值、变更 recommended 配置 | 8.0.0 中"remove formatting/layout rules"(CHANGELOG.md#L2276)、"replace ban-types with no-restricted-types, no-unsafe-function-type, no-wrapper-object-types"(CHANGELOG.md#L2287) |
parser/typescript-estree/scope-manager/types/type-utils/utils | 以不兼容方式增删 API | 8.0.0 中"remove slow deprecated and isolated programs"(CHANGELOG.md#L2277) |
值得注意的是:新增规则、新增可选参数、新增输出属性、JSDoc 注释均不视为破坏性变更,因此 CHANGELOG 中大量add ... rule条目只出现在 Features 而非 Breaking Changes 中。
2.3 版本发布节奏
从 CHANGELOG 的日期可以观察到稳定的周更节奏:v8 系列约每周发布一个 minor 版本(如 8.64.0 于 2026-07-13、8.65.0 于 2026-07-20、8.66.0 于 2026-08-03),每年年中(6-7 月)推出一个大版本。
三、monorepo 结构:CHANGELOG 中各包名对应的仓库目录
CHANGELOG 每一条目都带有**包名:**前缀,这些包名可以直接映射到仓库packages/目录下的同名文件夹。这是阅读 CHANGELOG 时最重要的"索引"能力:
| CHANGELOG 前缀 | 仓库目录 | 职责 |
|---|---|---|
eslint-plugin | packages/eslint-plugin | 全部 150 个 ESLint 规则实现(packages/eslint-plugin/src/rules) |
typescript-estree | packages/typescript-estree | TypeScript → ESTree 的 AST 转换器(packages/typescript-estree/src/convert.ts) |
parser | packages/parser | 供 ESLint 消费的解析器入口(packages/parser/src/parser.ts) |
scope-manager | packages/scope-manager | 作用域与变量引用分析 |
type-utils | packages/type-utils | 类型感知规则的工具函数 |
utils | packages/utils | 规则开发公共工具 |
ast-spec | packages/ast-spec | AST 类型规范定义 |
project-service | packages/project-service | 基于 TypeScript Project Service 的解析加速 |
rule-tester | packages/rule-tester | 规则测试框架 |
typescript-eslint | packages/typescript-eslint | 统一入口包(tseslint),导出配置助手与 globs |
website | packages/website | 官方文档站与 Playground |
举例说明映射的实用价值:若你在 CHANGELOG 中看到typescript-estree: handle import.defer() as ImportExpression(8.66.0),即可定位到 packages/typescript-estree/src/convert.ts 查看ImportExpression的实际转换逻辑;若看到scope-manager: export ClassStaticBlockScope(8.63.0),可到 packages/scope-manager/src/scope 目录查看对应的 Scope 类实现。
四、深度解读 v8:从 8.0.0 到 8.70.0 的现代体系
4.1 v8.0.0(2024-07-31)核心破坏性变更
8.0.0 小节是全文信息密度最高的一节,其 Breaking Changes 完整清单可归纳为六条主线:
- AST 规范化:
TSMappedType的typeParameter被拆分为constraint与key两个字段;新增TSEnumBody节点承载TSEnumDeclaration的 body;移除AST_NODE_TYPES.Import遗留类型(见 v5 部分 的铺垫);ast-spec删除废弃的类型参数。 - 解析器行为收紧:parser 默认总是开启
comment/loc/range/tokens;移除缓慢且已废弃的 isolated programs(旧版按单文件隔离解析的加速路径被 projectService 替代);EXPERIMENTAL_useSourceOfProjectReferenceRedirect与EXPERIMENTAL_useProjectService被移除/正式化为projectService。 - 配置与 globs:
parserOptions.project默认启用 dot globs(.开头的文件纳入匹配);allowDefaultProjectForFiles更名为allowDefaultProject(CHANGELOG.md#L2318 中明确"bring back in allowdefaultprojectforfiles rename");新增disallowAutomaticSingleRunInference。 - 规则体系重构:移除格式化/布局类规则(对齐 ESLint 官方"格式交给 Prettier"的立场);
ban-types被替换为no-restricted-types、no-unsafe-function-type、no-wrapper-object-types三规则;no-empty-object-type从ban-types与no-empty-interfaces中拆分独立;删除no-useless-template-literals、no-loss-of-precision、no-throw-literal等废弃规则。 - ESLint 9 对齐:
utils包的 ESLint 导出从LegacyESLint换成FlatESLint;no-unused-vars的 catch 子句行为对齐 ESLint 9;rule-tester全面切换到 flat config(switched to flat config)。 - 选项默认值变更:
prefer-nullish-coalescing的ignoreConditionalTests默认值改为true;no-floating-promises默认关闭checkThenables。
同时 v8 引入了几项重要 Feature:非类型感知 lint 借助 projectService 大幅提速(speed up non-type-aware linting with project service)、no-unused-vars新增reportUnusedIgnorePattern与ignoreClassWithStaticInitBlock选项、return-await加入strict-type-checked预设、rule-tester支持 multipass fixes、type-utils的TypeOrValueSpecifier支持交叉类型。
4.2 v8 系列的演进趋势:规则语义精细化与工程基建
从 8.63.0 到 8.70.0,v8 小版本的主题可以归纳为"修复误报、语义细化、响应 TypeScript 新语法":
- TypeScript 新语法支持:8.64.0 支持解析
import defer(并配套在 8.65.0 抛出非法语法错误);8.66.0 将import.defer()映射为ImportExpression节点;8.65.0 在检测到 TS 7 时给出警告,parser 新增onUnsupportedTypeScriptVersion选项以在遇到不支持的 TS 版本时报错。 - 类型感知规则的精确化:8.68.0 修复
no-unnecessary-type-assertion在递归类型下的栈溢出、8.69.0 的no-misused-promises新增flagUnions选项、8.70.0 修复no-unnecessary-condition在嵌套逻辑表达式 RHS 上的误报。 - 新规则与规则形态演进:8.69.0 引入
strict-void-return的修复建议;8.70.0 新增no-generated-empty-object-type规则(源自对any类型生成结果的检查);member-ordering、unified-signatures、no-deprecated等规则持续得到行为修正。
4.3 v8 工程侧:pnpm 与 Docusaurus
8.70.0 的两条 Fixes 明确写着"use stable release of pnpm 12"与"update pnpm to 12.3.4"(CHANGELOG.md#L10-L11),印证仓库根目录 pnpm-workspace.yaml 与 pnpm-lock.yaml 所代表的 pnpm workspace 工程形态;8.70.0 同时将website更新为按页面生成社交预览卡片,说明文档站(packages/website)是 v8 迭代中持续投入的一部分。
五、v7(2024-02-12):扁平配置时代的开端
7.0.0 小节的体量远小于 8.0.0,核心只有两条破坏性变更,但分量极重:
- 提升 ESLint / Node.js / TypeScript 的最低版本要求(标注 ⚠️):这是 v7 唯一的 Breaking Change,意味着旧环境下的用户必须先升级工具链才能安装 v7;
- 支持 flat config:这是 v7 最重要的功能增量。当前仓库中,根目录 eslint.config.mjs 正是 flat config 的实际使用样例,而 packages/typescript-eslint/src/config-helper.ts 的
config()助手与 packages/typescript-eslint/src/configs 下的预设(recommended、strict、strict-type-checked等)共同构成了 flat config 下的推荐用法。
v7 系列的后续版本延续了规则的增量演进:7.17.0 将no-unsafe-function-type、no-wrapper-object-types从 v8 反向移植回 v7;7.18.0 更新types包的 ECMA 版本。值得注意的是,7.18.0 与 8.0.0 的发布时间仅相差 3 天(2024-07-29 vs 2024-07-31),说明 v7 在 v8 发布前进入了收尾维护期,两个大版本之间存在明显的交接窗口。
六、v6 与更早版本:从 6.17.0 回溯到 6.0.0
v6 系列记录于 6.0.0 (2023-07-10) 至 6.17.0 (2024-01-01)。6.0.0 之前的版本格式仍是# x.y.z (日期),且使用### Bug Fixes/### Features分类,这些差异在阅读时需要注意。
v6 时期的代表性变化包括:6.21.0 支持parserOptions.project: false(关闭类型信息加载)、导出插件元数据;6.17.0 起改用新格式。v6 系列的完整演进还体现在其 Breaking Changes 段——位于 6.0.0 一节(其内部包含### BREAKING CHANGES子段,全文件共出现 5 次该标记:分别位于 v6.0.0、v5.x 的 L3677、v4.x 的 L4817、v3.x 的 L5443 附近及 L6276)。
七、版本演进时间线与大版本断代
将 CHANGELOG 中各大版本的首版日期汇总如下(来自各版本标题):
| 大版本 | 首版日期 | 时代特征 |
|---|---|---|
| 1.0.0 | 2019-01-20 | 项目奠基,规则以 Bug Fixes 迭代为主 |
| 2.0.0 | 2019-08-13 | 移除导出 parser、引入 EXPERIMENTAL 特性 |
| 3.x | 2020 年 | 类型系统与 TS 版本支持范围收紧 |
| 4.x | 2021 年 | BREAKING CHANGES 段中出现AST_NODE_TYPES.Import移除等 AST 清理 |
| 5.0.0 | 2022 年 | recommended 配置变更视为破坏性(L6276) |
| 6.0.0 | 2023-07-10 | 引入默认规则选项变更等破坏性调整 |
| 7.0.0 | 2024-02-12 | 提升最低版本要求、支持 flat config |
| 8.0.0 | 2024-07-31 | AST 规范化、规则体系重构、ESLint 9 对齐、projectService 正式化 |
从整体趋势看,v1→v5 时期 CHANGELOG 以Bug Fixes为主(当时规则数量快速增长);v6→v7 是配置体系变革期(flat config 落地);v8 是"重新筑基"期——大量历史负担(格式化规则、旧 API、experimental 选项)被一次性清理,为持续的小步快跑(每周 minor 版本)腾出空间。
八、如何用这份 CHANGELOG 指导实际开发
8.1 升级路径自查清单
基于 8.0.0 的 Breaking Changes,从 v7 升级到 v8 时应逐项核对:
- AST 消费者:若你写了自定义规则并访问
TSMappedType.typeParameter,需改为分别读取constraint与key;若访问TSEnumDeclaration.body,注意其类型已变为新的TSEnumBody节点(对应仓库 packages/ast-spec/src/element/TSEnumMember 与 packages/ast-spec/src/special/TSEnumBody)。 - 解析器配置:将
parserOptions.project的 dot 文件显式排除行为改为依赖默认启用的 dot globs;若使用了EXPERIMENTAL_useProjectService,改名为projectService。 - 规则迁移:
ban-types→no-restricted-types等三规则;no-empty-interface→no-empty-object-type。 - ESLint 版本:确认使用的 ESLint 版本与
utils包中FlatESLint导出兼容(v7 起已支持 flat config,v8 起全面以 flat 为默认形态)。
8.2 将 CHANGELOG 作为规则的"活文档"
CHANGELOG 中每条规则修复都可以在 packages/eslint-plugin/src/rules 与 packages/eslint-plugin/tests/rules 中找到对应实现与测试。例如 8.70.0 新增的no-generated-empty-object-type规则对应 packages/eslint-plugin/src/rules/no-generated-empty-object-type.ts,其行为、消息模板与配置 schema 均可从该文件及配套测试中得到完整验证。以这种方式阅读 CHANGELOG,可以把它变成一张"源码地图"。
8.3 多包协同开发视角
v8 系列的大量 Fixes 横跨eslint-plugin、typescript-estree、parser、project-service、scope-manager、rule-tester、type-utils、website等包,这说明任何一条规则的修复都可能涉及解析器(AST 形态)、作用域分析(引用判定)、类型工具(类型信息获取)三层联动。在阅读 CHANGELOG 时,建议把跨包的条目当作"架构边界变更信号"来对待——例如 8.66.0 的import.defer()支持同时出现在typescript-estree与parser两个前缀下,说明这是一次贯穿解析链路的语法能力升级。
九、与其他仓库文档的对照阅读
CHANGELOG 是发布事实的"结果层",若要理解"原因层",建议与以下仓库内文档对照:
- docs/users/Versioning.mdx:破坏性变更判定的完整规则,是解读 CHANGELOG 中 ⚠️ 条目的官方依据;
- docs/users/Releases.mdx:发布流程与节奏说明;
- docs/packages/Packages.mdx:monorepo 各包职责总览,帮助将 CHANGELOG 前缀映射到代码目录;
- docs/getting-started/Typed_Linting.mdx:类型感知 linting 的配置说明,对应 CHANGELOG 中大量类型相关规则条目;
- 各大版本的博客公告(如
announcing-typescript-eslint-v8,仓库内可见于 packages/website/blog 目录),提供比 CHANGELOG 更详细的迁移案例。
十、结语
一份优秀的 CHANGELOG 不只是"版本流水账",而是一部可检索、可验证的项目编年史。typescript-eslint 的这份 6571 行文档完整记录了项目从 2019 年初的 1.0.0 到 2026 年 8.70.0 的全部技术决策:它用统一的版本号管理 15+ 个相互依赖的包,用明确的标准判定破坏性变更,用周更节奏维持高速迭代,并在 v8 完成了一次彻底的"现代化清算"。无论你是规则开发者、迁移者还是架构评审者,都可以把本文介绍的"版本脉络 + 包名映射 + 破坏性变更清单 + 源码对照"四步法作为阅读与使用这份 CHANGELOG 的持久方法论。
【免费下载链接】typescript-eslint:sparkles: Monorepo for all the tooling which enables ESLint to support TypeScript项目地址: https://gitcode.com/GitHub_Trending/ty/typescript-eslint
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考