如何为代码块使用 @ts-ignore:TypeScript 中的 3 种方法

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

编辑器中的静默:我们为何要屏蔽 TypeScript?

\n\n

每个写过 TypeScript 至少一周的人,都遇到过编译器对看似正常的代码“报错”的情况。你确信逻辑正确,但 tsc 或 IDE 却把每第二行都标红。尤其当这种情况发生在一个代码块(循环、条件或函数)内部时,会特别令人头疼。

\n\n

标准的 // @ts-ignore 只对下一行有效。但如果需要一次性“堵住”编译器对 10 到 15 行代码的检查呢?在每一行前复制相同的注释是一条死路。这不仅会污染代码,还会使其难以阅读。

\n\n

在本文中,我们将探讨三种实际可行的方法,来为 TypeScript 中的整个代码块应用 @ts-ignore。您将了解每种方法何时适用,以及何时最好完全放弃抑制错误。开始吧!

\n\n

问题:@ts-ignore 只对单行有效

\n\n

让我们从一个基本示例开始。假设您正在处理来自 API 的动态数据,其类型可能会变化。您有一个代码块,它肯定能执行,但 TypeScript 对每次属性访问都报错。

\n\n
// 示例:解析来自不可靠 API 的响应\nconst data: any = { user: { name: 'Alice', age: 30 } };\n\n// @ts-ignore\nconsole.log(data.user.name); // OK,但仅限这一行\n\n// 如果不添加 // @ts-ignore,下一行会再次报错\n// console.log(data.user.age); // 错误:类型 'object' 上不存在属性 'age'\n
\n\n

在每一行前写 // @ts-ignore 是一种糟糕的做法。它会增加代码量,使重构复杂化,并隐藏真正的错误。但好消息是:TypeScript(从 3.9 版本开始)和社区已经想出了几个优雅的解决方案。

\n\n

方法 1:@ts-nocheck — 针对整个文件的粗暴力量

\n\n

最简单但也最彻底的方法是在文件开头添加 // @ts-nocheck。这会完全禁用整个文件的类型检查。但我们需要的只是一个代码块,而不是整个文件。不过,有一个技巧:您可以将有问题的代码块提取到一个单独的文件中,然后导入它。

\n\n

优点:

\n
    \n
  • 立即解决问题。
  • \n
  • 适用于您计划稍后重写的遗留代码。
  • \n
\n\n

缺点:

\n
    \n
  • 禁用文件中的所有类型检查。您可能会遗漏真正的错误。
  • \n
  • 不适用于具有严格 linting 规则的大型项目。
  • \n
  • 在代码中创建“黑盒”。
  • \n
\n\n
// bad.ts — 禁用了类型检查的文件\n// @ts-nocheck\nexport function processData(data: any) {\n    const result = data.user.name + ' is ' + data.user.age;\n    return result; // 即使 data 为 null,也不会报错\n}\n
\n\n

何时使用: 仅用于临时脚本或您正在重写的继承代码。切勿在生产环境中使用,除非明确标记了 TODO。

\n\n

方法 2:ts-expect-error — @ts-ignore 的智能替代品

\n\n

从 TypeScript 3.9 开始,引入了 // @ts-expect-error 指令。它的工作方式与 @ts-ignore 几乎相同,但有一个重要区别:如果没有错误,TypeScript 会发出警告。这有助于您在修复代码后不忘删除注释。

\n\n

但如何将其应用于代码块呢?答案是——无法直接应用。@ts-expect-error 也只对单行有效。然而,我们可以使用立即调用函数表达式(IIFE)的技巧。

\n\n
// 需要忽略的代码块,包裹在 IIFE 中\n(function() {\n    // @ts-expect-error — 期望下一行有错误\n    const x: number = 'hello'; // 错误:类型 'string' 不能赋值给类型 'number'\n\n    // @ts-expect-error — 又一个期望的错误\n    con                

博客

书籍推荐