【问题标题】:How to disable a ts rule for a specific line?如何禁用特定行的 ts 规则?
【发布时间】: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"
  ]
}

【问题讨论】:

    标签: javascript jquery typescript summernote


    【解决方案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>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-04-17
        • 1970-01-01
        • 2016-12-26
        • 2014-02-01
        • 2020-07-04
        • 2017-02-04
        • 2014-06-11
        • 2019-06-13
        相关资源
        最近更新 更多