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' из неопределенного (…)
Ответы
Ответ 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()
И с этим вы можете избежать "не нового" линтера и избежать неопределенного глобального без комментариев линтера.