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

新手上路,请多包涵

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

(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"
  ]
}

原文由 Amir 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

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

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

请注意, 官方文档“建议您非常谨慎地使用 [this]” 。几乎 总是 首选转换为 any ,因为这样可以更好地表达意图。


较旧的答案:

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

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

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

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

原文由 y2bd 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

操场


TypeScript 开发人员推荐什么?

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

我们添加 ts-ignore 的目的是将其用于任何现有类型系统机制无法抑制的剩余 5% [ ts-ignore ]你的代码库 [.] - microsoft/TypeScript#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;

▶ 扩充--- JQueryStatic 接口

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

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

在其他情况下, 速记声明/ 扩充 是编译没有/可扩展类型的模块的便捷实用程序。一个可行的策略也是 逐步迁移 到 TypeScript,通过 allowJscheckJs: false compiler flags .--- 保留尚未迁移的代码 .js

原文由 ford04 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题