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

2022-08-30 01:26:10

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");
}

请注意,官方文档“建议您非常谨慎地使用[这个]”。几乎总是倾向于投射,因为它更好地表达了意图。any


较旧的答案:

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

您始终可以暂时转换为 :$any

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

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


答案 2

@ts-expect-error

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

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

操场


TypeScript 开发人员推荐什么?

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

我们添加了ts-ignore,目的是将其用于任何现有类型系统机制无法抑制的其余5%[...]代码库中应该非常非常少[.] - microsoft/TypeScript#19139ts-ignore

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


问题案例的替代方案

▶ 使用任何类型

// 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;

扩充接口JQueryStatic

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

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

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