Tslint: 功能请求:允许排除特定规则的文件

创建于 2016-03-25  ·  14评论  ·  资料来源: palantir/tslint

问题

我想对我项目中的所有 TypeScript 文件使用“类名”规则,除了一个生成的文件。

当前规则选项配置格式

基于文档

规则选项可以是表示是否使用规则的布尔值真/假值,也可以是列表 [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],
或者如果使用 object 而不是数组,follwogin 语法会更简单:
"some-otherrule": [ {exclude: "**/generated.ts"}, arg1, arg2, arg3],
其中包含属性将默认为所有文件。

API Feature Request

最有用的评论

我有与@Chowarmaan 类似的用例。

我有测试文件*.test.ts在其中使用了开发依赖项,例如enzyme
tslint.json我启用了no-implicit-dependencies规则,我只想为*.test.ts禁用此规则。 这些测试文件并不都在同一个文件夹中,所以现在我必须放:

/* tslint:disable:no-implicit-dependencies */

在每个测试文件的开头,这很烦人

所有14条评论

你为什么不简单地使用:

/* tslint:disable:class-name */
// your generated file here

这不起作用吗?

这确实可以用来使它工作,但我提交了这个功能请求,以避免修改 TypeScript 生成器(或通过在生成的文件前面加上 tslint 提示来增加生成过程的复杂性)。
使用通配符也有利于将某些规则以声明方式应用于 tslint 配置中的特定类型的源(main/unitTests/e2eTests),而不是单独应用于每个文件。

你怎么看?

如果您不想在文件中添加注释,那么只需不要将文件传递给tslint进行 linting,不是吗?

当至少有两种实现(部分)文件排除的方法时,在其他地方添加更多选项感觉太重了

如果您不想在文件中添加注释,那么只需不要将文件传递给 tslint 进行 linting,不是吗?

这正是我所做的,但现在没有针对排除的文件检查任何规则。

当至少有两种实现(部分)文件排除的方法时,在其他地方添加更多选项感觉太重了

是的,这就是我所期望的答案;) 我也有一些疑问 - 至少对于实现(我试图保持尽可能简单)。

实际上,如果要实现这一点,那将是有益的,如果您可以为包含和排除模式定义常量,那么您不必将相同的包含/排除模式复制到要过滤的所有规则中相同的文件......我认为使示例更复杂可能不合理,但我有这样的想法:

{
    "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 除了简单的.json文件之外,还应该接受.js文件进行配置。 我认为这会帮助您解决用例——您可以设置两个tslint构建任务(一个用于常规源,一个用于生成源)并以编程方式禁用class-name规则之一它们在同一个tslintConfig.js文件中。

提交 #1065 以支持.js配置文件

很公平,我将关闭这个问题,只支持 js 配置文件

我有一个可能有意义的用例。 我有测试文件 (*.spec.ts),我想与它共享我的大部分 Typescript TSLint 规则,因为良好的编码实践也适用于我的测试。

但是,我正在测试为“幻数”规则配置的一些常量,以免我的代码中包含 5:
(Foo.substr(0,5);
但要确保它是一个常量
(Foo.substr(0,CONSTANT.FIVE);

因此,我的 const 测试用例包含在一个公共文件中,有一个测试以确保始终设置 const FIVE = 5。 测试然后expect(CONSTANTS.FIVE).toBe(5);未通过 TSLint 检查,因为在测试中使用了幻数。 虽然我不会以这种方式测试所有常量,但我确实想检查这些数字设置以确保它们不会更改,因为它们预计会保持特定大小。

我可以使用两种不同的 TSLint 配置,但我真的想避免它们不同步,或者在添加新规则时,必须在多个地方进行。

我可以为这个特定测试的一个文件执行 /* tslint:disable :no-magic-numbers*/ 对我

我有与@Chowarmaan 类似的用例。

我有测试文件*.test.ts在其中使用了开发依赖项,例如enzyme
tslint.json我启用了no-implicit-dependencies规则,我只想为*.test.ts禁用此规则。 这些测试文件并不都在同一个文件夹中,所以现在我必须放:

/* tslint:disable:no-implicit-dependencies */

在每个测试文件的开头,这很烦人

这是我遇到的类似问题以及@RomanGotsiy ,您可以在其中在测试文件的顶部添加禁用,但对于每个文件来说它确实变得很麻烦。 排除文件会很有帮助,因为您可以排除特定模式文件(测试文件,*.spec.ts)的规则,并拥有一个干净的配置文件,该文件还允许您根据需要简单地启用更多规则,并允许您的测试也可以使用它们。 也许排除文件列表将只包含您要禁用的规则,而不是将文件排除添加到每个规则中?

这个。 100%。 有一个 monorepo 的问题,其中测试依赖项列在工作区中,所以 tslint 正在哭泣no-implicit-dependencies 。 它必须使用单个配置文件完成,以便 IDE linting 仍然有效

我觉得这个问题也和#3447有关

我也将添加到这个陈旧的线程中。 我正在我的 Angular 项目中实施 NgRx 存储。 当我导出对函数的 const 引用时,AOT build 对我大喊大叫......

export const reducer = ( state = initialState, action: CurrentAction): CurrentState => {...}

给我一个Function expressions are not supported in decorators in 'reducers'错误。 问题出在我们的 linting 规则上。 我们在整个项目中专门启用了only-arrow-functions规则......在排除中添加模式匹配以说排除*.reducer.ts作为此特定规则的示例,但允许它对每个其他文件保持完整。

实际上,将这一行添加到每个减速器文件的文件顶部是很麻烦的。 似乎应该有更好的方法。

Necrobumping 这也是。 我正在尝试将 tslint-microsoft-contrib 添加到 Vue 项目和 .vue 文件上的一堆规则炸弹; 在规则作者开始解决这些错误之前,这可能是解决此类问题的有用方法 - 如果他们愿意的话。 实际上,在我编写的每个 Vue 文件中添加一条注释来禁用一堆规则确实很麻烦。 在 UI 代码中不那么严格或处理框架习语也是有意义的,例如使用默认导出

此页面是否有帮助?
0 / 5 - 0 等级