Як вимкнути правило ts для певного рядка?


82

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

Відповіді:


113

Ви можете використовувати /* tslint:disable-next-line */для локального відключення tslint. Однак, оскільки це помилка компілятора, відключення tslint може не допомогти.

Ви завжди можете тимчасово кинути $в any:

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

що дозволить вам отримати доступ до будь-яких властивостей, які ви хочете.


Редагувати: станом на Typescript 2.6, тепер ви можете обійти помилку / попередження компілятора для певного рядка:

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

Зверніть увагу, що офіційні документи "рекомендують використовувати [це] дуже економно" . Майже завжди переважно кидати anyзамість цього, оскільки це краще виражає намір.


1
Прийнята відповідь не відповідає на загальне запитання. Вимкніть правило .
Йозеф Б.

1
Існує активна проблема щодо @ts-ignoreконкретної помилки.
y2bd

і як відключити рядок всередині jsx?
Atombit

1
@Atombit Ось випуск GH із вирішенням цього питання: github.com/Microsoft/TypeScript/issues/27552
y2bd 05.03.20

25

@ts-expect-error

TS 3.9 представляє новий магічний коментар. @ts-expect-errorбуде:

  • мають таку ж функціональність, як @ts-ignore
  • викликати помилку, якщо насправді жодна помилка компілятора не була придушена (= вказує на марний прапор)
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"); 
}

Альтернативи

@ts-ignoreі @ts-expect-errorможе бути використана для всіх видів помилок компілятора. Що стосується проблем із типом (наприклад, в OP), я рекомендую одну з таких альтернатив через вужчу область придушення помилок:

▶ Використовуйте 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

В інших випадках скорочені декларації модулів або доповнення модулів для модулів, що не мають / розширюваних типів, є зручними утилітами. Життєздатною стратегією є також збереження неперенесеного коду.js та використання --allowJsз ним checkJs: false.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.