Я бы хотел использовать правило «имя класса» для всех файлов TypeScript в моем проекте, кроме одного файла, который создается.
На основании документации
Параметры правила могут быть либо логическим значением true / false, обозначающим, используется ли правило, либо списком [boolean, ...], где логическое значение обеспечивает то же, что и в случае без списка, а остальная часть списка - параметры правила, которое будет определять, что оно проверяет
Итак, в основном, если я хочу включить правило, у меня есть только два варианта с точки зрения формата параметров правила, как показано здесь:
{
"rules": {
"class-name": true,
"some-otherrule": [ true, arg1, arg2, arg3],
...
}
}
Таким образом, текущий формат не позволяет мне включать / отключать определенные правила для некоторых файлов. Если бы я хотел исключить один файл из проверки на наличие ошибок, мне нужно было бы исключить этот файл для всех правил.
Чтобы разрешить исключение некоторых файлов, расширенный формат
list [boolean, ...], где логическое значение обеспечивает то же, что и в случае без списка
"some-otherrule": [ true, arg1, arg2, arg3],
можно расширить, чтобы первый аргумент мог быть либо логическим (как сейчас), либо массивом (или, возможно, объект был бы более понятным по сравнению с массивом?), который определяет файлы, которые включены / исключены.
Имею в виду следующий синтаксис:
"some-otherrule": [ [includeGlobPattern, excludeGlobPattern], arg1, arg2, arg3],
Например
"some-otherrule": [ ["**/*", "**/generated.ts"], arg1, arg2, arg3],
или, может быть, если бы вместо массива использовался объект, синтаксис follwogin был бы еще проще:
"some-otherrule": [ {exclude: "**/generated.ts"}, arg1, arg2, arg3],
где свойство include будет по умолчанию для всех файлов.
Почему бы вам просто не использовать:
/* tslint:disable:class-name */
// your generated file here
Это не работает?
Это действительно могло быть использовано для его работы, но я подал этот запрос функции, чтобы избежать изменения генератора TypeScript (или усложнить процесс генерации, добавив сгенерированные файлы с подсказками tslint).
Использование подстановочных знаков также может быть полезно для декларативного применения определенных правил только к определенным типам источников (main / unitTests / e2eTests) из конфигурации tslint, а не к каждому файлу в отдельности.
Что ты думаешь?
Если вы не хотите помещать комментарии в файл, просто не передавайте файл в tslint
для линтинга, не так ли?
Кажется слишком тяжелым добавлять дополнительные параметры где-либо еще, когда есть как минимум два средства достижения (частичного) исключения файлов.
Если вы не хотите помещать комментарии в файл, просто не передавайте файл в tslint для линтинга, не так ли?
Это именно то, что я сделал, но теперь ни одно из правил не проверяется на исключенные файлы.
Кажется слишком тяжелым добавлять дополнительные параметры где-либо еще, когда есть как минимум два средства достижения (частичного) исключения файлов.
Да, это то, что я ожидал в качестве ответа;) У меня тоже были некоторые сомнения - по крайней мере, насчет реализации (которую я старался сделать как можно проще).
На самом деле, если бы это было реализовано, было бы полезно, если бы вы могли определить константы для шаблонов включения и исключения, поэтому вам не нужно копировать один и тот же шаблон включения / исключения во все правила, в которых вы хотите фильтровать те же файлы ... Я подумал, что было бы неразумно усложнять пример, но я имел в виду что-то вроде этого:
{
"constants": {
"generatedFilesGlob": "**/generated.ts",
"someOtherConstant": "some other value, that could be reused",
...
},
"rules": {
"class-name": true,
"some-otherrule": [ true, "arg1", "arg2", "arg3"],
"rule-with-exclude": [ {"exclude": "generatedFilesGlob"}, "arg1", "arg2", "arg3"],
...
}
}
но это затруднит анализ файла конфигурации. Это заставило меня задуматься о поддержке файлов js для конфигурации в дополнение к файлам json. Например:
const generatedFilesGlob = "**/generated.ts";
const allExceptGenerated = {exclude: generatedFilesGlob};
module.exports = {
"rules": {
"class-name": true,
"some-otherrule": [ true, "arg1", "arg2", "arg3"],
"rule-with-exclude": [ allExceptGenerated , "arg1", "arg2", "arg3"],
"another-rule-with-the-same-exclude-pattern": [ allExceptGenerated , "arg1", "arg2", "arg3"],
...
}
}
Использование файлов JavaScript с модулями (например, gulp) имеет еще одно преимущество - они позволяют комментировать и не так строго относятся к запятым после последнего элемента в массиве или свойства в объекте.
@ atsu85 интересная проблема, но, как указал @myitcv, я не хочу вводить списки файлов / глобусы в tslint.json
из-за дополнительной сложности / беспорядка в файле конфигурации. Я согласен с тем, что TSLint должен принимать файлы .js
для настройки в дополнение к простым файлам .json
. Я думаю, это поможет вам решить этот вариант использования - вы можете настроить две задачи сборки tslint
(одну для ваших обычных источников, одну для сгенерированных источников) и программно отключить правило class-name
в одной из них в том же файле tslintConfig.js
.
Файл № 1065 для поддержки файлов конфигурации .js
Честно говоря, я закрываю эту проблему в пользу только файлов конфигурации js.
У меня есть вариант использования, который может иметь смысл. У меня есть тестовые файлы (* .spec.ts), с которыми я хочу поделиться большей частью моих правил Typescript TSLint, так как хорошие методы кодирования применимы и к моим тестам.
Однако я тестирую некоторые константы, настроенные для правила «магических чисел», чтобы в моем коде не было 5:
(Foo.substr(0,5);
но убедитесь, что это константа
(Foo.substr(0,CONSTANT.FIVE);
Таким образом, мой тестовый пример для моей константы, включенной из общего файла, имеет тест, гарантирующий, что const FIVE = 5 всегда установлена. Затем тест expect(CONSTANTS.FIVE).toBe(5);
не проходит проверку TSLint, поскольку в тесте используется магическое число. Хотя я не тестирую все константы таким образом, я все же хочу проверить эти числовые параметры, чтобы убедиться, что они не меняются, поскольку ожидается, что они сохранят определенный размер.
Я мог бы использовать две разные конфигурации TSLint, но я действительно хочу, чтобы они не рассинхронизировались или при добавлении нового правила не приходилось делать это в нескольких местах.
Я могу сделать / * tslint: disable : no-magic-numbers * / для одного файла для этих конкретных тестов, который действительно работает для меня, но, возможно, в некоторых других случаях в файле тестов общее правило может быть исключением, и вместо обновления каждого * .spec.ts будет работать глобальный шаблон для правила?
У меня такой же вариант использования, как у @Chowarmaan.
У меня есть тестовые файлы *.test.ts
в которых я использую зависимости разработчика, например enzyme
.
В tslint.json
у меня включено правило no-implicit-dependencies
и я хочу отключить это правило только для *.test.ts
. Не все эти тестовые файлы находятся в одной папке, поэтому сейчас я должен поместить:
/* tslint:disable:no-implicit-dependencies */
в начале каждого тестового файла, который раздражает
Это аналогичная проблема, с которой я столкнулся, а также с @RomanGotsiy, где вы можете добавить отключение в верхней части тестовых файлов, но это становится громоздким для каждого файла. Файлы исключения были бы полезны, поскольку вы могли бы исключить правила для определенных файлов шаблонов (тестовые файлы, * .spec.ts) и иметь один чистый файл конфигурации, который также позволяет вам просто включать больше правил по мере необходимости и разрешать ваши тесты также использовать их. Может быть, тогда список исключаемых файлов будет просто включать правила, которые вы хотите отключить, вместо того, чтобы добавлять исключения файлов к каждому правилу?
Этот. 100%. Возникла эта проблема с монорепозиторием, где тестовые зависимости перечислены в рабочей области, поэтому tslint плачет о no-implicit-dependencies
. Это нужно сделать с помощью одного файла конфигурации, чтобы линтинг IDE продолжал работать.
Думаю, эта проблема тоже связана с # 3447
Я также собираюсь добавить к этой устаревшей теме. Я нахожусь в процессе реализации магазина NgRx в моем проекте Angular. Сборка AOT кричит на меня, когда я экспортирую константную ссылку на функцию ...
export const reducer = ( state = initialState, action: CurrentAction): CurrentState => {...}
Выдает ошибку Function expressions are not supported in decorators in 'reducers'
. Проблема возникает из-за наших правил линтинга. Мы специально включили правило only-arrow-functions
для всего проекта ... было бы замечательно добавить сопоставление с образцом в исключении, чтобы сказать исключить файлы *.reducer.ts
в качестве примера для этого конкретного правила, но разрешить он останется неизменным для всех остальных файлов.
Как бы то ни было, добавление этой строки в начало файла для каждого файла-редуктора обременительно. Просто кажется, что должен быть способ получше.
Некробампинг и это тоже. Я пытаюсь добавить tslint-microsoft-contrib в проект Vue и кучу его правил для файлов .vue; это может быть полезным обходным путем для подобных проблем, прежде чем авторы правил приступят к устранению этих ошибок - если они когда-нибудь захотят. В настоящее время добавление комментария для отключения кучи правил абсолютно в каждый файл Vue, который я пишу, действительно громоздко. Также имеет смысл быть немного менее строгим в коде пользовательского интерфейса или иметь дело с идиомами фреймворка, например, использование экспорта по умолчанию.
Самый полезный комментарий
У меня такой же вариант использования, как у @Chowarmaan.
У меня есть тестовые файлы
*.test.ts
в которых я использую зависимости разработчика, напримерenzyme
.В
tslint.json
у меня включено правилоno-implicit-dependencies
и я хочу отключить это правило только для*.test.ts
. Не все эти тестовые файлы находятся в одной папке, поэтому сейчас я должен поместить:в начале каждого тестового файла, который раздражает