Deslop: 针对 AI 生成的 TypeScript 代码的 Oxlint 规则

概述

Deslop 是 Oxlint 生态系统的一个专用插件,提供了一套主观的规则,旨在识别并拒绝“AI 垃圾代码”(AI-slop)——即那些通常由 LLM 生成、缺乏充分证据、依赖不安全类型断言或表现出糟糕 API 用法的代码模式。通过对 TypeScript 代码强制执行更严格的约束,Deslop 帮助开发者在集成 AI 辅助功能开发时维护代码库的完整性。

核心功能与规则

Deslop 将其规则分为三个主要领域:类型安全、代码质量和测试标准。该插件基于 anti-slop 项目最初开发的规则构建,并扩展了 deslop/* 命名空间下的额外自定义规则。

类型安全与证据

这些规则旨在防止 AI 常见的倾向,即通过不安全的断言绕过 TypeScript 类型系统。主要规则包括:

  • no-chained-type-assertions:拒绝嵌套的 as 或尖括号断言,这些断言会伪造类型证据。
  • no-unknown-parameters 和 no-unknown-returns:禁止在函数签名和返回契约中使用 unknown,强制要求显式的类型定义。
  • require-safety-comment-for-type-assertion:强制要求为非 const 断言提供不变性理由,确保开发者记录为何需要该断言。

代码质量与 API 使用

为了防止生成过于复杂或非惯用的代码,Deslop 针对 LLM 频繁使用的特定 API 模式进行了限制:

  • no-reflect-apply 和 no-reflect-get:限制使用全局 Reflect 方法,这些方法经常被 Claude 等模型过度使用。
  • no-array-filter-map:防止低效的相邻急切数组操作,鼓励使用性能更高的迭代器管道。

测试标准

Deslop 包含了一些旨在提高测试套件可靠性的规则,这在依赖 AI 生成代码时至关重要。这些规则包括:

  • no-module-mocking:拒绝使用 Vitest 和 Jest 模块模拟,以鼓励更好的依赖注入。
  • no-poor-substring-tests:标记那些依赖弱子字符串匹配进行验证的测试。

开发者反馈与用例

Deslop 及类似工具的早期采用者强调,激进的 Linting 是扩展 AI 辅助开发的前提。开发者指出,如果没有这样的护栏,维护一个高 AI 参与度的代码库将变得难以管理。

"我参与的项目最近大量转向 AI 辅助功能开发,如果没有极其防御性/激进的 lint 配置和接近 80% 的测试覆盖率,这些开发工作几乎是不可能完成的。" — @SSchick

用户还强调了将 Oxlint 与其他基于 AST 的工具结合使用的重要性,以确保跨不同语言和 LLM 输出的代码质量。像 ast-grep-essentials 这样的项目经常被引用为团队构建 AI 生成代码自定义验证管道的补充工具。

安装与使用

Deslop 以 npm 包的形式分发,并与任何 Oxlint JavaScript 插件运行时兼容,包括 Bun、Deno 和 Node.js。要集成它,用户需将插件添加到其 oxlint 配置文件中:

import { defineConfig } from "oxlint";
import { configs as deslopConfigs } from "ai-deslop";

export default defineConfig({
  jsPlugins: ["ai-deslop"],
  options: deslopConfigs.recommended.options,
  rules: deslopConfigs.recommended.rules
});

对于需要更细粒度控制的团队,该插件还提供了一组可选规则,例如 no-duplicate-types 和针对 Tailwind CSS v4 的 canonical-class-names,可以根据特定的项目需求启用。

Sources