Wie deaktiviere ich eine ts-Regel für eine bestimmte Zeile?

78

Summernote ist ein jQuery-Plugin, für das ich keine Typdefinitionen benötige. Ich möchte nur das Objekt ändern, aber TS wirft immer wieder Fehler. Die folgende Zeile gibt mir immer noch Folgendes an : "Die Eigenschaft 'summernote' ist für den Typ 'jQueryStatic' nicht vorhanden." Error.

(function ($) {

  /* tslint:disable */
  delete $.summernote.options.keyMap.pc.TAB;
  delete $.summernote.options.keyMap.mac.TAB;
  /* tslint:enable */

})(jQuery)

Bearbeiten:

Hier ist meine 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
quelle

Antworten:

105

Sie können /* tslint:disable-next-line */tslint lokal deaktivieren. Da dies jedoch ein Compilerfehler ist, hilft das Deaktivieren von tslint möglicherweise nicht.

Sie können jederzeit vorübergehend Folgendes $besetzen any:

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

Damit können Sie auf alle gewünschten Eigenschaften zugreifen.


Bearbeiten: Ab Typescript 2.6 können Sie jetzt einen Compilerfehler / eine Compilerwarnung für eine bestimmte Zeile umgehen:

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

Beachten Sie, dass die offiziellen Dokumente "empfehlen, [dies] sehr sparsam zu verwenden" . Es ist fast immer vorzuziehen, anystattdessen zu besetzen, da dies die Absicht besser ausdrückt.

y2bd
quelle
1
Die akzeptierte Antwort beantwortet die allgemeine Frage nicht. Deaktivieren Sie eine Regel .
Josef.B
1
Es gibt ein aktives Problem bezüglich @ts-ignoreeines bestimmten Fehlers.
y2bd
und wie deaktiviere ich die Leitung in jsx?
Atombit
1
@Atombit Hier ist ein GH-Problem mit der Lösung dafür: github.com/Microsoft/TypeScript/issues/27552
y2bd
22

@ts-expect-error

TS 3.9 führt einen neuen magischen Kommentar ein. @ts-expect-errorwerden:

  • haben die gleiche Funktionalität wie @ts-ignore
  • einen Fehler auslösen, wenn tatsächlich kein Compilerfehler unterdrückt wurde (= zeigt nutzloses Flag an)
if (false) {
  // @ts-expect-error: Let's ignore a single compiler 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"); 
}

Alternativen

@ts-ignoreund @ts-expect-errorkann für alle Arten von Compilerfehlern verwendet werden. Für Typprobleme (wie in OP) empfehle ich aufgrund des engeren Bereichs zur Fehlerunterdrückung eine der folgenden Alternativen:

anyTyp verwenden

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

Augment- JQueryStatic Schnittstelle

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

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

In anderen Fällen sind Kurzmoduldeklarationen oder Modulerweiterungen für Module ohne / erweiterbaren Typ nützliche Dienstprogramme. Eine praktikable Strategie besteht auch darin , nicht migrierten Code beizubehalten.js und --allowJsmit ihm zu verwenden checkJs: false.

ford04
quelle