開發工具
Show HN:Deslop – 針對 AI 生成 TypeScript 的 Oxlint 規則
Show HN: Deslop – Oxlint rules for AI-generated TypeScript

github.com · 2026-10-14
摘要
Deslop 是一套專為 AI 生成程式碼設計的 Oxlint 規則,旨在自動偵測 TypeScript 程式碼中的不安全型別、重複程式碼以及低價值的測試。對於依賴 AI 輔助開發的團隊而言,這提供了一種新的靜態分析手段,用於提升 AI 產出程式碼的品質與安全性。
針對 AI 生成程式碼中的低品質寫法,開發者推出一套名為 `ai-deslop` 的 Oxlint 規則套件。這套規則帶有明確主張,會拒絕低證據、低訊號、被稱為「AI 垃圾」(AI-slop)的程式碼寫法。
規則來源與授權
`ai-deslop` 的規則不是完全獨立開發,而是整合自多個來源:一部分來自 `dmmulroy/anti-slop` 專案的通用規則,另外再加上額外的 `deslop` 規則。所有規則都已重新命名,歸在 `deslop/*` 命名空間下。被整合的原始碼採用 MIT 授權條款釋出。
安裝與環境相容性
開發者可以用 `npm install --save-dev ai-deslop` 把套件裝成開發環境依賴項。安裝 `ai-deslop` 時,會自動帶入 `@oxlint/plugins` 作為執行階段依賴(runtime dependency)。使用者需要讓 `@oxlint/plugins` 的版本與專案使用的 oxlint 版本保持同步。
執行環境方面,這個套件提供的是已編譯的 JavaScript 檔案,因此任何支援 JS 插件的 oxlint 執行環境都能使用,包括 Bun、Deno 或 Node.js。
配置方法
要在專案中啟用這些規則,需要修改 oxlint 的設定檔。配置範例顯示,開發者要從 `oxlint` 匯入 `defineConfig`,並從 `ai-deslop` 匯入 `configs`(別名為 `deslopConfigs`)。在預設匯出的配置中,`jsPlugins` 陣列要包含 `["ai-deslop"]`,`options` 與 `rules` 則分別對應 `deslopConfigs.recommended.options` 與 `deslopConfigs.recommended.rules`。
核心檢查規則
套件提供多條針對特定程式碼寫法的檢查規則。
### 類型斷言與未知類型處理
類型斷言方面,`no-chained-type-assertions` 會拒絕巢狀的 `as` 或角括號斷言,因為這類斷言會捏造證據。`no-widen-then-assert` 則拒絕在做縮窄斷言之前,先把已知證據擴大範圍。對於非常數(non-const)的斷言,`require-safety-comment-for-type-assertion` 要求提供不變量 justification(理由)。
未知類型方面,`no-known-value-widening` 拒絕讓已知表達式流入明確的 `unknown`、`object` 或開放字典類型。`no-unknown-parameters` 拒絕函數輸入使用 `unknown`,`no-unknown-returns` 則拒絕解析為 `unknown` 的返回契約。`no-unknown-type-aliases` 拒絕解析後類型為 `unknown` 的類型別名。此外,`no-unsafe-dictionary-type` 拒絕建立在不安全逃逸通道(escape hatches)上的字典值。
### 函數參數與邊界檢查
`no-object-parameters` 拒絕在函數輸入中使用 `object`。`no-runtime-typeof` 則要求使用邊界解析(boundary parsing),而不是臨時拼湊的 `typeof` 縮窄寫法。
### 測試與斷言邏輯
測試程式碼方面,套件有多條規則。`no-call-only-assertions` 會標記只檢查 mock 呼叫的測試。`no-module-mocking` 直接拒絕使用 Vitest 和 Jest 的模組 mock 功能。`no-poor-substring-tests` 拒絕測試常量字串是否包含子字串的寫法。`no-repeated-expect-call` 會標記測試檔案中相鄰、重複相同呼叫的斷言,建議重複使用結果;這條規則不提供自動修復。
### 陣列操作與反射
陣列處理方面,`no-array-filter-map` 拒絕相鄰的急切(eager)陣列 filter/map 遍歷,但允許惰性迭代器管線。`no-reduce-accumulator-copy` 拒絕在 reducer 中以非展開(non-spread)方式複製累加器,並建議同時啟用原生的 `oxc/no-accumulating-spread` 規則。此外,套件也拒絕使用全域的 `Reflect.apply` 與 `Reflect.get`。
### 其他語法與命名慣例
套件還有幾條關於命名與語法的規則。`no-shape-in-symbol-names` 拒絕在本地擁有的符號名稱中使用 `shape`。`no-pass-through-type-alias` 禁止只用來重新命名其他類型的別名。`no-duplicate-consts` 會報告在不同檔案中使用相同靜態值的全大寫常數。`no-duplicate-types` 會報告完全重複的物件契約,且不提供自動修復。`no-renamed-imports` 會在原始名稱沒有模組層級衝突時,修復不必要的具名匯入別名。`canonical-class-names` 則修復非標準的 Tailwind CSS v4 類別拼寫。
內建 TypeScript 規則
除了自訂規則,套件也列出部分 TypeScript 相關的規則。`typescript/no-deprecated` 禁止使用標記為 `@deprecated` 的程式碼,這條規則需要類型感知 linting(type-aware linting)。`typescript/no-require-imports` 禁止用 CommonJS 的 `require()` 匯入。`typescript/no-floating-promises` 禁止懸空 promises,同樣需要類型感知 linting。`typescript/no-unnecessary-condition` 禁止始終為真、假或 nullish 的條件判斷,也需要類型感知 linting。另外,`no-unreachable` 禁止無法到達的程式碼。
詳細配置參考
`no-duplicate-consts` 的配置與精確靜態值比較的行為,文件中有說明。`no-duplicate-types` 的精確比較行為、worker 作用域、完整的 TypeScript/JSON 範例,以及所有支援的選項,文件中也有說明。`no-renamed-imports` 則說明了何時會修復具名匯入別名,以及如何處理衝突。
●開發者:可引入此工具自動檢查 AI 生成的 TypeScript 程式碼,減少潛在的型別錯誤與重複程式碼
重要性評分
🟠 值得關注
喜歡這篇?每天早晨還有更多。
訂閱 5min AI,讓 AI 替你追蹤整個 AI 世界。
相關指南

Google AI Studio Vibe Coding 教學:快速原型開發實戰
深入解析 Vibe Coding 是什麼,並提供 Google AI Studio 使用教學。透過 Google 程式碼生成技術,快速建立原型,提升開發效率。
閱讀指南 →
Perplexity vs ChatGPT:2026 搜尋與對話 AI 工具比較
深入比較 Perplexity vs ChatGPT 2026 版本,分析 perplexity 和 chatgpt 差異,解答 perplexity 好用嗎,並提供最佳 ai 搜尋工具推薦與選擇建議。
閱讀指南 →
Laya 開源決策模型中文實測:零樣本 53 題判斷題結果
Laya 是 Apache 2.0 的開源決策模型,不生成文字、只做選擇題。我們用 53 題中文長文判斷題零樣本實測,記錄結果、設定陷阱與使用建議。
閱讀指南 →🤖 本文摘要由 AI 自動生成,內容源自原始報導。如有疑慮,請參閱關於我們。
喜歡這篇?每天早晨還有更多。
訂閱 5min AI,讓 AI 替你追蹤整個 AI 世界。