繁体   English   中英

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

[英]How to disable a ts rule for a specific line?

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

从 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

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

@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 [。 ] - 微软/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编译器标志将尚未迁移的代码保留在.js

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

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

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

我在错误之前使用了// @ts-ignore:next-line

此答案类似,您可以覆盖JQueryStatic类型定义以包含summernote属性。

interface JQueryStatic {
  // Opt out of type-checking summernote using the any type
  // See https://www.typescriptlang.org/docs/handbook/basic-types.html#any
  summernote: any
}

(function ($) {

  delete $.summernote.options.keyMap.pc.TAB;
  delete $.summernote.options.keyMap.mac.TAB;

})(jQuery)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM