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

Ami*_*mir 34 javascript jquery typescript summernote

Summernote是一个jQuery插件,我不需要它的类型定义.我只想修改对象,但TS不断抛出错误.下面的一行仍然告诉我:"'jQueryStatic'类型中不存在"属性'summernote'." 错误.

(function ($) {

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

})(jQuery)
Run Code Online (Sandbox Code Playgroud)

编辑:

这是我的tsconfig.json

{
  "compilerOptions": {
    "outDir": "./dist/",
    "sourceMap": true,
    "noImplicitAny": true,
    "module": "commonjs",
    "target": "es5",
    "allowJs": true,
    "noUnusedParameters": true
  },
  "include": [
      "js/**/*"
  ],
  "exclude": [
      "node_modules",
      "**/*.spec.ts"
  ]
}
Run Code Online (Sandbox Code Playgroud)

for*_*d04 60

@ts-expect-error

TypeScript 3.9引入了一个新的魔法注释。@ts-expect-error将要:

  • 具有相同的功能 @ts-ignore
  • 触发错误,如果实际上没有抑制编译器错误(= 表示无用标志)
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"); 
}
Run Code Online (Sandbox Code Playgroud)

操场


TypeScript 开发人员推荐什么?

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

我们添加了 ts-ignore 的目的是将其用于无法被任何现有类型系统机制抑制的剩余 5% [...]ts-ignore在您的代码库中应该有非常非常少的s[.] -微软/打字稿#19139

[...] 从根本上说,我们认为您根本不应该在 TypeScript 中使用抑制。如果是类型问题,您可以将其排除(这就是存在any、强制转换和速记模块声明的原因)。如果是语法问题,一切都会很糟糕,无论如何我们都会被破坏,所以抑制不会做任何事情(抑制不会影响解析错误)。-微软/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;
Run Code Online (Sandbox Code Playgroud)

? 增强 JQueryStatic界面

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

// ./main.ts
delete $.summernote.options.keyMap.pc.TAB; // works
Run Code Online (Sandbox Code Playgroud)

在其他情况下,速记声明/扩充是编译没有/可扩展类型的模块的方便实用程序。一个可行的策略也是逐步迁移到 TypeScript,将尚未迁移的代码保留在.jsviaallowJscheckJs: false编译器标志中。


y2b*_*2bd 58

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

您可以随时暂时转换$any:

delete ($ as any).summernote.options.keyMap.pc.TAB
Run Code Online (Sandbox Code Playgroud)

这将允许您访问您想要的任何属性.


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

if (false) {
    // @ts-ignore: Unreachable code error
    console.log("hello");
}
Run Code Online (Sandbox Code Playgroud)

请注意,官方文档"建议您非常谨慎地使用[this]".它几乎总是最好投以any代替为更好地表达意图.

  • 接受的答案没有回答一般问题。禁用*规则*。 (7认同)
  • 有一个关于特定错误的“@ts-ignore”的[一个活跃问题](https://github.com/Microsoft/TypeScript/issues/19139)。 (3认同)
  • @Atombit这是一个 GH 问题及其解决方案:https://github.com/Microsoft/TypeScript/issues/27552 (2认同)
  • “@ts-ignore”不是推荐的解决方案,而是使用建议的“@ts-expect-error” (2认同)

Gio*_*dze 37

// @ts-ignore:next-line在错误发生之前就使用了。至于参考,请访问文档


Ahs*_*ooq 11

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

  • 有时你可能想禁用 eslint ```// eslint-disable-next-line @typescript-eslint/ban-ts-comment``` (10认同)

for*_*nee 7

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

// eslint-disable-next-line @typescript-eslint/<RELEVANT_ESLINT_RULE>
Run Code Online (Sandbox Code Playgroud)