重构shi山工程,却遇到全局的1000+ts问题...

起因

我接到组里的任务,需要迁移包,但是涉及的页面基本涵盖全站了,所以我怕测试测的时候会有遗漏,以及有些隐含的错误导致上线后爆炸,所以我就执行了

shell 复制代码
npx tsc --noEmit --watch false

然后我就得到了如下:


🔧 一、​​错误标记与基线建立(优先冻结历史问题)​

  1. ​统一抑制历史错误​

    使用 suppress-ts-errors 工具批量添加注释,将现有错误标记为"已知问题",避免干扰新代码检查:

    scss 复制代码
    npx suppress-ts-errors --mode baseline
    • 该工具会自动在错误位置插入 // @ts-expect-error// @ts-ignore 注释,并附带错误代码说明。
    • ​优势​:将历史错误转化为显式忽略清单,后续新增错误会因无抑制注释而暴露。
  2. ​按需使用高级抑制策略​

    • ​文件级忽略​ :对错误密集且暂不重构的文件,在文件顶部添加 // @ts-nocheck
    • ​目录级配置​ :通过 tsconfig.jsonexclude 字段排除非核心模块的检查(慎用)。

🛡️ 二、​​重构安全保障策略​

  1. ​隔离重构范围​

    • 使用 // @ts-expect-error 而非 @ts-ignore:前者要求后续修复错误后必须移除注释,否则会报错,避免遗忘。

    • ​示例​​:

      c 复制代码
      // @ts-expect-error TS2345: 历史类型不匹配,待重构
      const value: string = legacyFunctionReturningNumber();
  2. ​增量编译与防御性编程​

    • ​检查范围聚焦​​:仅检查修改的文件,降低历史错误干扰:

      css 复制代码
      npx tsc --noEmit --incremental --watch false
    • ​防御性类型保护​​:对不确定的第三方库或遗留代码,使用类型断言和守卫函数:

      javascript 复制代码
      function isError(value: unknown): value is Error {
        return value instanceof Error || 
               (!!value && typeof value === 'object' && 'message' in value);
      }
      try { ... } 
      catch (e) {
        if (isError(e)) console.error(e.stack); // 安全访问属性
      }

🔍 三、​​渐进修复策略​

  1. ​错误分类与优先级排序​

    ​错误类型​ ​处理策略​ ​优先级​
    安全修复(如类型断言) 立即修复 ⭐⭐⭐
    复杂重构(接口调整) 标记后纳入迭代计划 ⭐⭐
    第三方库类型缺失 补充 @types/ 包或声明文件
  2. ​分阶段修复流程​

    css 复制代码
    graph TD
      A[抑制所有历史错误] --> B[开启严格模式检查新代码]
      B --> C[按模块逐个修复历史错误]
      C --> D[移除已修复模块的抑制注释]
    • 每修复一个模块,移除对应文件的抑制注释,确保进度可视化。

⚙️ 四、​​工具链与自动化支持​

  1. ​ESLint 集成​

    配置规则 @typescript-eslint/ban-ts-comment,限制抑制注释滥用:

    json 复制代码
    {
      "rules": {
        "@typescript-eslint/ban-ts-comment": ["error", {"ts-expect-error": false}]
      }
    }
    • 允许 @ts-expect-error 但禁止 @ts-ignore,提升代码质量。
  2. ​预提交钩子检查​

    通过 husky + lint-staged 确保新增代码无编译错误:

    json 复制代码
    "lint-staged": {
      "*.ts": "tsc --noEmit --incremental"
    }

👥 五、​​团队协作与知识管理​

  1. ​错误文档化​

    使用 suppress-ts-errors 生成错误报告,关联到任务管理系统(如Jira):

    css 复制代码
    npx suppress-ts-errors --report > technical-debt.md
  2. ​定期技术债务清理​

    将历史错误修复纳入迭代计划,每周分配固定工时处理。


💎 总结

​核心思路​ ​:

✅ ​​先冻结​ ​(抑制历史错误)→ ​​再隔离​ ​(确保新代码零错误)→ ​​渐进修复​​(分模块推进)。

通过此方案可以在重构过程中精准识别新引入的错误(历史错误已被标记),同时通过类型守卫和自动化工具降低风险。对于遗留错误,建议按业务影响和修复成本制定优先级,避免陷入"全量修复"的泥潭。

相关推荐
东方小月9 小时前
从零开发一个 Coding Agent(四):使用状态机校验大模型事件流
前端·人工智能·后端
Csvn9 小时前
🧩 ESM vs CJS 混用的 7 个「天坑」——从 TypeScript 编译到 Node 与浏览器
前端
Csvn9 小时前
🎯 Web 性能 API 集合:Performance Observer 的 5 个冷门妙用
前端
Csvn9 小时前
深入 React 闭包陷阱:从根源上理解并根治 stale closure
前端
whyfail9 小时前
前端学 Spring Boot(8):接口为什么越用越慢?
前端·spring boot·后端
用户0595401744610 小时前
LangChain 记忆测试踩坑实录:这两个坑让我排查了 4 小时
前端·css
程序员黑豆10 小时前
鸿蒙应用开发:@Monitor 装饰器使用教程
前端·harmonyos
SamChan9011 小时前
在Web应用中集成PDF多语言翻译功能:PDFTranslator API实战指南
前端·python·ai·pdf·yapi·机器翻译
kyriewen11 小时前
AI Agent 9秒删光了生产数据库——我给自己的项目做了5个紧急检查
前端·ai编程·claude
IT_陈寒11 小时前
JavaScript的this又双叒叕让我怀疑人生了
前端·人工智能·后端