Skip to content

基于类型的代码检查(Alpha 版)


我们很高兴宣布,Oxlint 中基于类型的代码检查已进入 Alpha 版本!

概述

继我们在八月的技术预览之后,我们非常激动地宣布:基于类型的代码检查现已达到 Alpha 稳定阶段。这一里程碑带来了稳定性、可配置性和规则覆盖范围的重大提升。

基于类型的代码检查支持强大的规则,如 no-floating-promisesno-misused-promisesawait-thenable,它们利用 TypeScript 的类型系统来捕捉潜在的错误。目前已有 43 个基于类型的规则可供使用,让你能在运行时错误发生前就发现整个类别的问题。

在本文中:

快速开始

安装 oxlintoxlint-tsgolint,然后使用 --type-aware 标志运行:

sh
npm add -D oxlint oxlint-tsgolint@latest
npx oxlint --type-aware
sh
pnpm add -D oxlint oxlint-tsgolint@latest
pnpm oxlint --type-aware
sh
yarn add -D oxlint oxlint-tsgolint@latest
yarn oxlint --type-aware
sh
bun add -D oxlint oxlint-tsgolint@latest
bunx oxlint --type-aware

若想仅测试某个特定的基于类型规则而无需其他配置(需已全局或本地安装 oxlint-tsgolint):

sh
npx oxlint --type-aware -A all -D typescript/no-floating-promises
sh
pnpx oxlint --type-aware -A all -D typescript/no-floating-promises
sh
yarn oxlint --type-aware -A all -D typescript/no-floating-promises
sh
bunx oxlint --type-aware -A all -D typescript/no-floating-promises

有关更多配置选项,请参阅我们的 使用指南

性能表现

项目Oxlint + 基于类型检查ESLint + typescript-eslint提升幅度
vuejs/core2.531 秒20.800 秒8.22 倍
outline/outline4.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 类型:

json
{
  "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 规则相同:

ts
/* 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 使用这些规则。tsgolintoxlint 组合目前支持 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 在性能优化方面的持续投入,以及规则选项支持的实现。

试用一下

准备好了吗?请前往上方的 快速开始 章节,安装并运行基于类型的代码检查。

我们非常期待听到你对基于类型代码检查的反馈,并期待看到它如何帮助改善你的开发流程。

与我们连接: