Подтвердить что ты не робот

EsLint - Подавить "Не использовать" новые "для побочных эффектов"

Я видел способ подавить это с помощью jsLint, попробовал, это не сработало.

Мне нужно ключевое слово "new" или мой скрипт не работает.

Как я могу подавить это в.eslintrc?

Большое спасибо

Обновление: по запросу Иордании. [Обратите внимание, мое приложение написано в ReactJs]

 // 3rd party 
 const AnimateSlideShow = require('../js-animation');

 export default class Animate extends React.Component {

   .......

    fetchJsAnimation() {
      const animation = this.refs.Animation;
      new AnimateSlideShow(animation);
    }
   ......
  }

Ошибка: не используйте "новый" для побочных эффектов no-new

Теперь, если я удовлетворю EsLint, мое приложение вылетает:

Uncaught (в обещании) TypeError: Невозможно установить свойство '_handleMouse' из неопределенного (…)

4b9b3361

Ответ 1

Здесь приведена документация для рассматриваемого правила ESLint: http://eslint.org/docs/rules/no-new.html

Запретить new Для побочных эффектов (no-new)

Цель использования new с конструктором - это, как правило, создание объекта определенного типа и сохранение этого объекта в переменной, например:

var person = new Person();

Менее распространено использование new и не сохранять результат, например:

new Person();

В этом случае созданный объект отбрасывается, потому что его ссылка не хранится нигде, и во многих случаях это означает, что конструктор должен быть заменен функцией, которая не требует использования новой.

Я вложил это выше, потому что считаю важным понять, каково намерение правила, а не только, как заставить его уйти.

Если вы не можете найти способ избавиться от new, вы можете подавить эту ошибку с помощью директивы eslint-disable:

fetchJsAnimation() {
  /* eslint-disable no-new */
  const animation = this.refs.Animation;
  new AnimateSlideShow(animation);
}

Директивы ESLint ограничены блоками, поэтому они будут подавляться только внутри этой функции. Вы также можете подавлять правила в одной строке с директивой eslint-disable-line:

new AnimateSlideShow(animation); // eslint-disable-line no-new

Если вам действительно нужно отключить это правило для всего проекта, то в разделе .eslintrc "rules" установите для этого правила значение 0:

{
  // ...
  "rules": {
    "no-new": 0,
    // ...
  }
}

Вы также можете сделать это предупреждение вместо ошибки, установив его на 1 (2 - ошибка).

Ответ 2

Попробуй включить свою функцию в анонимную функцию

(()=>code)();

в вашем примере

fetchJsAnimation() {
  const animation = this.refs.Animation;
  (()=>new AnimateSlideShow(animation))();
}

Или вы можете использовать этот шаблон, например, современный фреймворк JavaScript. vuejs vue Вот пример

(() => new Vue({ 
    el: '#app', 
    router, 
    store, 
    components: { App }, 
    template: '<App/>' 
}))();

Ответ 3

Продолжая ответ на саркироку, здесь версия ES5 (по сути IIFE с оператором возврата):

(function (Vue) {
  'use strict';

  return new Vue({
    el: '.unity-header-wrapper'
  });
}(Vue));

Мы избегаем ESLint неиспользуемой ошибки var, которая появляется при использовании этого способа:

var myApp = new Vue({
  el: '.unity-header-wrapper'
});

Мы также избегаем использования автономной реализации 'new Vue()' (которая предотвращает ошибку побочных эффектов в ESLint)

var myApp = new Vue({
  el: '.unity-header-wrapper'
});

Вы также можете добавить Vue как глобальный в конфигурации ESLint, чтобы избежать неопределенной глобальной ошибки var, как показано здесь: Глобальные переменные в Javascript и ESLint

// .eslintrc.json
"globals": {
  "Vue": true
}

Ответ 4

Я использую более декларативную форму, используя метод init() внутри моего класса. Например:

class Example {
  constructor () { ... }
  init () { //this method is using for initialize the instance }
}

Итак, когда вы инициализируете этот экземпляр:

const example = new Example()
example.init()

И с этим вы можете избежать "не нового" линтера и избежать неопределенного глобального без комментариев линтера.