Tslint: no-unused-variable TypeError: невозможно прочитать свойство '1', равное нулю

Созданный на 17 мая 2018  ·  14Комментарии  ·  Источник: palantir/tslint

Сообщение об ошибке

  • __TSLint версия__: 5.10.0
  • __TypeScript version__: 2.8.1
  • __ Запуск TSLint через__: CLI

Линтинг кода TypeScript

import { A, B, C } from './file';

console.log('No imports used');

export const D = 4;

с конфигурацией tslint.json :

{
  "rules": {
    "no-unused-variable": [true, {"ignore-pattern": "^_"}]
  }
}

Фактическое поведение

The 'no-unused-variable' rule threw an error in '/Users/andrew.mitchell/Documents/Projects/test/test.ts':
TypeError: Cannot read property '1' of null
    at walk (/Users/andrew.mitchell/Documents/test/node_modules/tslint/lib/rules/noUnusedVariableRule.js:105:54)
    at Rule.AbstractRule.applyWithFunction (/Users/andrew.mitchell/Documents/test/node_modules/tslint/lib/language/rule/abstractRule.js:39:9)
    at Rule.applyWithProgram (/Users/andrew.mitchell/Documents/test/node_modules/tslint/lib/rules/noUnusedVariableRule.js:32:21)
    at Linter.applyRule (/Users/andrew.mitchell/Documents/test/node_modules/tslint/lib/linter.js:194:29)
    at /Users/andrew.mitchell/Documents/test/node_modules/tslint/lib/linter.js:139:85
    at Object.flatMap (/Users/andrew.mitchell/Documents/test/node_modules/tslint/lib/utils.js:151:29)
    at Linter.getAllFailures (/Users/andrew.mitchell/Documents/test/node_modules/tslint/lib/linter.js:139:32)
    at Linter.lint (/Users/andrew.mitchell/Documents/test/node_modules/tslint/lib/linter.js:99:33)
    at /Users/andrew.mitchell/Documents/test/node_modules/tslint/lib/runner.js:209:32
    at step (/Users/andrew.mitchell/Documents/test/node_modules/tslint/node_modules/tslib/tslib.js:133:27)

Ожидаемое поведение

Правило должно предупреждать All imports in import declaration are unused. для строки 1.

Это вызвано noUnusedVariableRule.ts # L123, потому что сообщение failure - это All imports in import declaration are unused. , в котором нет имени переменной, которое может найти регулярное выражение.

Это правило работает правильно, если параметр ignore-pattern не указан, поскольку он не будет пытаться проверить имя переменной.

Fixed Bug

Самый полезный комментарий

Определение noUnusedLocals и noUnusedParameters в compilerOptions не совсем то же самое, что no-unused-variable tslint. На данный момент неиспользуемые вары либо приводят к сбою сборки, либо остаются незамеченными, и режима предупреждения больше нет 😞

Все 14 Комментарий

Хорошая находка @hotforfeature. Я начал решать эту проблему в https://github.com/palantir/tslint/pull/3919, потому что это связано с некоторыми изменениями в TS 2.9, которые только усугубят эту проблему.

Мой PR предотвращает создание исключения, однако он просто игнорирует ignorePattern в упомянутых вами случаях, что не очень хорошо. Я считаю, что нам нужно добавить какой-то сложный код вроде того, что мы делаем для импорта автофиксов прямо сейчас: /

Мне интересно, стоит ли нам отказаться от этого правила. tsc теперь предоставляет способ игнорировать свои предупреждения и обеспечивает поддержку автоматических исправлений для своих предупреждений через IDE.

Насколько я понимаю, основным преимуществом этого правила является ignore-pattern , но это трудно реализовать правильно так, как правило теперь написано в зависимости от диагностики tsc. TSLint также немного более гибок, чем tsc, в отношении отключения правил в определенных файлах. @suchanlee есть мысли по этому

Мой основной вариант использования этого правила - автоисправление проблем при фиксации в хуке git при линтинге. Так что я по-прежнему считаю, что здесь есть большая ценность, даже если tsc предлагает что-то через интеграцию с IDE.

@JKillian, я думаю, что поддержка правила становится все более дорогостоящей благодаря поддержке TSLint нескольких версий Typescript и постоянным изменениям в поведении Typescript. И поскольку Typescript поддерживает эту функцию, мы должны склоняться к ее использованию. Но поскольку более ранние версии TS не поддерживают его, я не думаю, что мы должны его удалять. Однако я думаю, что нам следует подумать об отказе от правила и работать с людьми TS, чтобы лучше поддерживать текущие рабочие процессы TSLint с TS.

Я поддержу предложение

@hotforfeature - подтвердите свой вариант использования и

Как всегда, любой может скопировать исходный код правила и переместить его во внешний пакет и продолжать использовать / улучшать его таким образом!

Для чего это стоит:

{
  "compilerOptions":  {
    "noUnusedLocals": true,
    "noUnusedParameters": true,
  }
}

Использование приведенного выше в tsconfig позволяет отключить правило no-unused-variable lint.

no-unused-variable устарела, и compilerOptions указанное выше, теперь является официальным решением.

Определение noUnusedLocals и noUnusedParameters в compilerOptions не совсем то же самое, что no-unused-variable tslint. На данный момент неиспользуемые вары либо приводят к сбою сборки, либо остаются незамеченными, и режима предупреждения больше нет 😞

@giladgray , @killtheliterate написал:

Использование приведенного выше в tsconfig позволяет отключить правило lint без неиспользуемых переменных.

Я не хочу отключать это правило, потому что, как писал @kachkaev

Определение noUnusedLocals и noUnusedParameters в compilerOptions не совсем то же самое, что no-unused-variable tslint.

Мой вариант использования - это сгенерированный код. Я хочу, чтобы мой код, написанный вручную, следовал этому правилу, но, чтобы избежать чрезмерной сложности генератора кода, я хотел бы отключить это правило в сгенерированном коде (или, по крайней мере, в некоторых разделах сгенерированного кода) - это то, что может ' Это можно сделать с помощью параметров компилятора TypeScript 😞

По крайней мере, это устаревание должно быть задокументировано на веб-сайте TSLint , но я полностью согласен с тем, что это устаревание было преждевременным. Есть ли планы пересмотреть? Будет ли принят вклад сообщества?

Это осуждение смешно. Флаги компилятора - УЖАСНАЯ замена. Они ломают конструкцию и сами себя не исправляют. Как такое разумное решение указывать людям? Если вариант ignore-pattern слишком сложен для работы сейчас, вместо этого откажитесь от него.

👋 ребята - просто свяжите это с https://github.com/palantir/tslint/issues/4232. Хорошо известно и согласовано, что встроенные параметры компилятора _не_ достаточная замена для no-unused-variable . Первоначальная реализация правила не подходила для других инструментов TS, и ее пришлось отключить. # 4232 отслеживает, как снова включить его.

А пока вы можете использовать что-то вроде tsc --noEmit --noUnusedLocals --noUnusedParameters в качестве отдельного инструмента для использования встроенных проверок. Да, это не так хорошо, как настраиваемый no-unused-variables .

продолжить обсуждение в # 4100 и # 4232

Была ли эта страница полезной?
0 / 5 - 0 рейтинги