如何禁用特定行的 ts 规则?

Posted

技术标签:

【中文标题】如何禁用特定行的 ts 规则?【英文标题】:How to disable a ts rule for a specific line? 【发布时间】:2017-09-22 22:51:26 【问题描述】:

Summernote 是一个 jQuery 插件,我不需要为它定义类型。我只想修改对象,但 TS 不断抛出错误。下面这行仍然给我:“属性 'summernote' 不存在于类型 'jQueryStatic'。” 错误。

(function ($) 

  /* tslint:disable */
  delete $.summernote.options.keyMap.pc.TAB;
  delete $.summernote.options.keyMap.mac.TAB;
  /* tslint:enable */

)(jQuery)

编辑:

这是我的 tsconfig.json


  "compilerOptions": 
    "outDir": "./dist/",
    "sourceMap": true,
    "noImplicitAny": true,
    "module": "commonjs",
    "target": "es5",
    "allowJs": true,
    "noUnusedParameters": true
  ,
  "include": [
      "js/**/*"
  ],
  "exclude": [
      "node_modules",
      "**/*.spec.ts"
  ]

【问题讨论】:

【参考方案1】:

从 Typescript 2.6 开始,您现在可以绕过特定行的编译器错误/警告:

if (false) 
    // @ts-ignore: Unreachable code error
    console.log("hello");

请注意the official docs "recommend you use [this] very sparingly"。几乎总是最好改为any,因为这样可以更好地表达意图。


旧答案:

您可以使用/* tslint:disable-next-line */ 在本地禁用 tslint。但是,由于这是一个编译器错误,因此禁用 tslint 可能无济于事。

您可以随时将$ 临时转换为any

delete ($ as any).summernote.options.keyMap.pc.TAB

这将允许您访问所需的任何属性。

【讨论】:

接受的答案不回答一般问题。禁用规则 有 an active issue 与 @ts-ignore 相关的特定错误。 以及如何在 jsx 中禁用 line? @Atombit 这是一个 GH 问题的解决方案:github.com/Microsoft/TypeScript/issues/27552 @ts-ignore 不是推荐的解决方案,而是使用建议的@ts-expect-error【参考方案2】:

@ts-expect-error

TypeScript 3.9 引入了一个新的魔法评论。 @ts-expect-error 将:

具有与@ts-ignore相同的功能 触发错误,如果实际上no编译器错误已被抑制(= 表示无用标志)
if (false) 
  // @ts-expect-error: Let's ignore a compile error like this unreachable code 
  console.log("hello"); // compiles


// If @ts-expect-error didn't suppress anything at all, we now get a nice warning 
let flag = true;
// ...
if (flag) 
  // @ts-expect-error
  // ^~~~~~~~~~~~~~~^ error: "Unused '@ts-expect-error' directive.(2578)"
  console.log("hello"); 

Playground


TypeScript 开发人员有什么建议?

@ts-ignore@ts-expect-error 就像是编译错误的大锤。对于大多数情况,TypeScript 开发人员建议使用更细粒度、范围更窄的类型系统解决方案:

我们添加 ts-ignore 的目的是为了将其用于任何现有类型系统机制无法抑制的剩余 5% [...] 在您的代码库[.] - microsoft/TypeScript#19139

[...] 从根本上说,我们认为您根本不应该在 TypeScript 中使用抑制。如果是类型问题,您可以排除它(这就是存在any、转换和速记模块声明的原因)。如果这是一个语法问题,那么一切都很糟糕,无论如何我们都会被打破,所以抑制不会做任何事情(抑制不会影响解析错误)。 - microsoft/TypeScript#19573


问题案例的替代方案

▶ 使用any 类型

// type assertion for single expression
delete ($ as any).summernote.options.keyMap.pc.TAB;

// new variable assignment for multiple usages
const $$: any = $
delete $$.summernote.options.keyMap.pc.TAB;
delete $$.summernote.options.keyMap.mac.TAB;

▶AugmentJQueryStatic接口

// ./global.d.ts
interface JQueryStatic 
  summernote: any;


// ./main.ts
delete $.summernote.options.keyMap.pc.TAB; // works

在其他情况下,shorthand declarations / augmentations 是用于编译没有/可扩展类型的模块的便捷实用程序。一个可行的策略也是 incrementally migrate 到 TypeScript,keeping not yet migrated code in .js 通过 allowJscheckJs: false 编译器标志。

【讨论】:

【参考方案3】:

您可以在该行之前简单地使用以下内容: // @ts-ignore

【讨论】:

有时你可能想禁用 eslint // eslint-disable-next-line @typescript-eslint/ban-ts-comment【参考方案4】:

如果您使用eslint 来执行检查或修复,您可以通过将其添加到该行的顶部来禁用该行

// eslint-disable-next-line @typescript-eslint/<RELEVANT_ESLINT_RULE>

【讨论】:

以上是关于如何禁用特定行的 ts 规则?的主要内容,如果未能解决你的问题,请参考以下文章

ESlint:关闭项目中的特定规则

如何避免 tslint 特定规则?

如何对 *.spec.ts 文件使用不同的 tslint.json

如何使用#pragma 警告禁用 CA1814?

关闭特定文件的eslint规则

如何在 TSLint 中对 js 和 ts 使用相同的规则