基于类型的代码检查(Alpha 版)
我们很高兴宣布,Oxlint 中基于类型的代码检查已进入 Alpha 版本!
概述
继我们在八月的技术预览之后,我们非常激动地宣布:基于类型的代码检查现已达到 Alpha 稳定阶段。这一里程碑带来了稳定性、可配置性和规则覆盖范围的重大提升。
基于类型的代码检查支持强大的规则,如 no-floating-promises、no-misused-promises 和 await-thenable,它们利用 TypeScript 的类型系统来捕捉潜在的错误。目前已有 43 个基于类型的规则可供使用,让你能在运行时错误发生前就发现整个类别的问题。
在本文中:
- 快速开始 - 在几分钟内上手基于类型的代码检查
- 性能表现 - 了解基于类型的代码检查相较于 ESLint 快了多少
- 自技术预览以来的新功能 - 新特性与改进
- 技术细节 - 基于类型代码检查的内部工作原理
- 下一步计划 - 即将推出的 Beta 版本改进方向
快速开始
安装 oxlint 与 oxlint-tsgolint,然后使用 --type-aware 标志运行:
npm add -D oxlint oxlint-tsgolint@latest
npx oxlint --type-awarepnpm add -D oxlint oxlint-tsgolint@latest
pnpm oxlint --type-awareyarn add -D oxlint oxlint-tsgolint@latest
yarn oxlint --type-awarebun add -D oxlint oxlint-tsgolint@latest
bunx oxlint --type-aware若想仅测试某个特定的基于类型规则而无需其他配置(需已全局或本地安装 oxlint-tsgolint):
npx oxlint --type-aware -A all -D typescript/no-floating-promisespnpx oxlint --type-aware -A all -D typescript/no-floating-promisesyarn oxlint --type-aware -A all -D typescript/no-floating-promisesbunx oxlint --type-aware -A all -D typescript/no-floating-promises有关更多配置选项,请参阅我们的 使用指南。
性能表现
| 项目 | Oxlint + 基于类型检查 | ESLint + typescript-eslint | 提升幅度 |
|---|---|---|---|
| vuejs/core | 2.531 秒 | 20.800 秒 | 8.22 倍 |
| outline/outline | 4.448 秒 | 55.070 秒 | 12.38 倍 |
基准测试在配备 M2 Max 12 核心(8 个性能核心和 4 个能效核心)的 MacBook Pro 上完成。
我们的性能测试表明,oxlint 配合基于类型检查的功能,比 eslint 搭配 typescript-eslint 快约 10 倍。欲了解更多信息,请查看我们的 性能基准测试。
此外,oxlint 还可在执行代码检查的同时进行类型检查,从而避免重复工作——因为大部分类型信息已在基于类型检查过程中计算完成。
已知问题
尽管 tsgolint 已适合在生产代码库中测试,但在处理非常庞大的代码库时,你可能会遇到内存不足的问题。我们正在优化下一阶段的内存使用。如果你愿意尝试 tsgolint,欢迎在 tsgolint 仓库 中报告任何内存溢出问题,并附上你的项目详情,以帮助我们进一步优化内存使用。
自技术预览以来的新功能?
在代码检查期间支持类型检查
现在,tsgolint 支持在代码检查过程中输出来自 TypeScript 的类型检查错误。由于基于类型规则本身就需要对文件中的所有类型进行检查,我们能够复用这些已有的类型信息,而不是丢弃它。这意味着在某些情况下,可以完全跳过单独执行类型检查命令(例如 tsc --noEmit),从而减少在 CI 中执行代码检查和类型检查的总耗时。
此功能仍为实验性质,但你可以通过在 oxlint 命令中添加 --type-check 与 --type-aware 标志来启用:
$ oxlint --type-aware --type-check
× typescript(TS2322): 类型 'number' 不能赋值给类型 'string'。
╭─[index.ts:1:7]
1 │ const message: string = 1
· ───────
╰────oxlint 中对规则配置的支持
在 tsgolint 中运行的基于类型规则,现在也可以像其他 oxlint 规则一样在 oxlint 中进行配置。例如,你可以配置 no-floating-promises 规则,允许某些安全调用或忽略 void 类型:
{
"rules": {
"typescript/no-floating-promises": [
"error",
{
"ignoreVoid": true,
"allowForKnownSafePromises": [
{ "from": "file", "name": "SafePromise" },
{ "from": "lib", "name": "PromiseLike" }
]
}
]
}
}配置选项与 typescript-eslint 所支持的一致,详细文档可在每个规则的配置部分找到(例如 no-floating-promises)。
oxlint 中对行内禁用注释的支持
在 tsgolint 中运行的规则现在可通过在文件中或某一行上添加注释来禁用,方式与其它 oxlint 规则相同:
/* oxlint-disable typescript/no-floating-promises */
// oxlint-disable-next-line typescript/no-floating-promises
[1, 2, 3].map(async (x) => x + 1);更多支持的规则
我们持续推动将 typescript-eslint 中流行的规则移植到 oxlint 中,你现在可以通过 oxlint 使用这些规则。tsgolint 与 oxlint 组合目前支持 43 个基于类型的规则。
自首次预览以来,新增支持以下规则:
现在会报告 TypeScript 程序诊断信息
此前,若 TypeScript 无法创建或解析程序,这些错误不会被报告,导致用户困惑于为何代码检查未生效。现在,我们会在创建程序时报告所有问题,包括 tsconfig.json 文件中的配置问题。
例如,如果 tsconfig.json 包含 baseUrl,这将被报告为错误,因为 baseUrl 已在 TypeScript 7.0 中移除:
$ oxlint --type-aware
× typescript(tsconfig-error): 无效的 tsconfig
╭─[tsconfig.json:4:3]
3 │ "compilerOptions": {
4 │ "baseUrl": ".",
· ─────────
5 │ "experimentalDecorators": true,
╰────
help: 选项 'baseUrl' 已被移除。请从配置中删除它。
详情请见:https://github.com/oxc-project/tsgolint/issues/351基于类型的规则支持自动修复
基于类型的规则现在支持通过 --fix 标志实现自动修复。当你运行 oxlint --type-aware --fix 时,tsgolint 中可修复的诊断将像常规 oxlint 修复一样应用。这使得修复流程与非基于类型的规则完全一致。
技术细节
架构设计
Oxlint 中的基于类型代码检查采用独特的双二进制架构:
oxlint CLI (Rust)
├─ 处理文件遍历、忽略逻辑和诊断信息
├─ 运行非基于类型的规则和自定义 JS 插件
├─ 将路径和配置传递给 tsgolint
└─ 格式化并显示结果
tsgolint (Go)
├─ 直接使用 typescript-go 进行类型检查
├─ 执行基于类型的规则
└─ 返回结构化的诊断信息这种设计使 Oxlint 的核心保持高速,同时通过 typescript-go 利用 TypeScript 的类型系统。前后端分离意味着 oxlint 负责用户体验,而 tsgolint 负责繁重的类型分析任务。
TypeScript 兼容性
tsgolint 基于 typescript-go,这是 Microsoft 使用 Go 语言重写的 TypeScript,将在未来成为 TypeScript v7.0。有关 TypeScript 7 进展的更多信息,请参阅 官方 TypeScript 博客文章。这意味着你可能会遇到一些不再受支持的功能。
重要兼容性说明:
- 仅支持 TypeScript 7.0 及以上版本的功能
- 7.0 之前的语法和已废弃功能不被支持
- 旧版
tsconfig.json选项(如baseUrl)已在 TypeScript 7.0 中移除
如果你仍在使用来自 TypeScript 6.0 及更早版本的已废弃功能,你需要先迁移代码库。有关更新已废弃的 tsconfig 选项的帮助,请参阅 TypeScript 迁移指南。
实现细节
tsgolint 并未使用 typescript-go 的公开 API。相反,它通过 打补丁 的方式编译 typescript-go,以暴露其内部接口。我们持续关注 typescript-go 的更新,并在需要时修复破坏性变更。
我们的 typescript-go 分支通过 renovatebot 定期同步,确保始终紧跟最新改进与修复。一旦 TypeScript 7.0 正式发布,我们将转而追踪稳定版本,而非主分支的最新提交。
下一步计划
我们正在积极开发以下改进,以准备即将到来的 Beta 版本:
- 支持更多规则 - 当前我们支持
typescript-eslint中 59 个基于类型规则中的 43 个。随着向 Beta 版本迈进,我们计划继续扩展规则覆盖率。 - 性能与内存使用优化 - 我们将持续优化性能,特别是针对大型单体仓库。
致谢
我们衷心感谢以下人员和团队:
- TypeScript 团队创造了
typescript-go。 typescript-eslint团队提供了温暖的支持。- @auvred 创建了
tsgolint。 - @camchenry 在性能优化方面的持续投入,以及规则选项支持的实现。
试用一下
准备好了吗?请前往上方的 快速开始 章节,安装并运行基于类型的代码检查。
我们非常期待听到你对基于类型代码检查的反馈,并期待看到它如何帮助改善你的开发流程。
与我们连接:
- Discord:加入我们的 社区服务器 以参与实时讨论
- GitHub:在 GitHub Discussions 中分享反馈
- 问题报告:将
oxlint的问题报告至 oxc,将基于类型代码检查的问题报告至 tsgolint。


