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

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

注意,官方文档“建议你尽量少用这个”。几乎总是更可取的方法是转换为any,因为这样可以更好地表达意图。


年长的回答:

可以使用/* tslint:disable-next-line */在本地禁用tslint。然而,由于这是一个编译器错误,禁用tslint可能没有帮助。

你可以临时将$转换为任意值:

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、强制转换和简写模块声明的原因)。如果是语法问题,一切都很糟糕,我们无论如何都会被破坏,所以抑制不会做任何事情(抑制不影响解析错误)。-微软/打印稿# 19573


疑问句的替代词

▶使用任何类型

// 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: false编译器标记将尚未迁移的代码保留在.js中。


你可以在行前简单地使用以下语句: / / @ts-ignore


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

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

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