Tslint: 缩进规则未报告或修复缩进尺寸违规

创建于 2017-05-23  ·  66评论  ·  资料来源: palantir/tslint

错误报告

  • __TSLint 版本__:5.3.2
  • __打字稿版本__:2.3.2
  • __通过__运行TSLint:CLI

正在整理 TypeScript 代码

export function foo() {
  return 123;
}

使用tslint.json配置:

{
  "extends": ["tslint:latest"],
  "rules": {
    "indent": {
      "options": ["spaces", 4]
    }
  }
}

实际行为

tslint没有错误。 tslint --fix没有修复。

预期行为

错误报道tslint ,修复与应用tslint --fix ,这样生成的文件是这样的:

export function foo() {
    return 123;
}

2723 并没有像我预期的那样工作。 问题似乎是只有在使用错误的空白字符时才会报告失败,而不是在缩进大小关闭时(如我的示例中)。 相关来源

Available in ESLint Formatting rule P2 Declined Bug

最有用的评论

我遇到了同样的问题。 下面的规则将捕获正在使用的制表符而不是空格,但不会捕获错误数量的空格。 我可以将 2 更改为任何其他数字,但仍然没有错误。 我正在使用 tslint 5.5.0。

"indent": [true, "spaces", 2],

所有66条评论

@adidahiya查看@nchen63 的评论

来自@nchen63

它修复制表符 -> x 空格和 x 空格 -> 制表符,但不修复 x 空格 -> y 空格

不过它应该做x spacesy spaces

我的项目同时使用 2 个和 4 个空格。 将规则x spaces修复为y spaces将非常有用。

我也遇到了这个问题,希望它能修复尺寸违规,或者至少将它们报告为错误,以便我可以修复它们。 目前,网站 (https://palantir.github.io/tslint/rules/indent/) 上记录的缩进大小的配置实际上并没有做任何事情。

是的,请修复此错误。 Angular CLI 在生成文件或项目时使用 2 个空格作为缩进级别,并且所有引号都是单引号。 然后它运行 tslint 以根据用户的 tslint.json 修复这些。 引号效果很好(根据我的喜好转换为双引号),但缩进保持在 2 个空格(而我更喜欢 4 个)。 Tslint 只在看到实际的 TAB 字符时才报告错误,但它也应该检查空格数似乎是合理的

在我看来, https://github.com/palantir/tslint/blob/master/src/rules/indentRule.ts中使用的实现非常幼稚,我不希望它为x spaces -> y spaces 。 根据此处的评论,该方法似乎适用于制表符,但我认为这种方法不适用于空格。

假设,例如,选择了 2 个空格的缩进宽度,并考虑以下代码:

foo = {
    a: {
  b: {
    c: 'c'
  }
    },
    d: 'd'
}

我们当前的实现如何知道完全失败? 每个空格序列都通过正则表达式/ / 。 即使我们寻找 2 个空格的倍数,这也会通过。 类似地,在多级缩进场景中,4 个前导空格可能是通过的场景,而以 4 个空格开始单级缩进应该失败。

我认为任何解决方案都需要遍历 AST,类似于 eslint 所做的(https://github.com/eslint/eslint/blob/master/lib/rules/indent.js)。 这样做的缺点是我们会对tabs -> spacesspaces -> tabs性能造成轻微影响。 我们可以通过根据设置选择实现来解决这个问题,但我预计如果使用制表符和空格的组合,当前的实现将失败,在这种情况下,我们应该只使用基于 AST 的解决方案。

我认为至少在 eslint 实现中完成的一些 AST 工作可以由 typescript 的库直接处理,因此解决方案应该不会太难写。

我们当前的实现如何知道完全失败?

_技术上_不需要。 align规则会阻止您编写这样的代码。 当然,我们也可以在indent规则中遍历 AST。 我只关心indentalign某种组合允许我完成我在问题描述中写的内容。

对齐规则会阻止您编写这样的代码。

好的! 我在检查源代码时错过了这一点。 我也去那边顶一下。 TBH,我有点喜欢利用现有规则让其他人尽可能天真的想法。

我遇到了同样的问题。 下面的规则将捕获正在使用的制表符而不是空格,但不会捕获错误数量的空格。 我可以将 2 更改为任何其他数字,但仍然没有错误。 我正在使用 tslint 5.5.0。

"indent": [true, "spaces", 2],

有任何更新吗? (如果有人还没有进行修复,我愿意试一试。)

@mDibyo去吧

@mDibyo你在这方面取得了任何进展吗?

我有一个部分实现。 将尝试完成它并在周末提出 PR

只是想提醒一下,自从我开始在我的项目中使用带有

另一方面,Prettier 努力将最多的代码放入每一行。

如果你不想那样呢?

将打印宽度设置为 120 时,prettier 可能会产生过于紧凑或其他不受欢迎的代码。

我们在项目中使用了 120 个字符。


此外,它是另一种依赖。 我想我更喜欢只使用常规的 TSLint 规则。

我想我更喜欢只使用常规的 TSLint 规则。

@glen-84 是的,这很好,这就是为什么我不是说我们应该从 TSLint 中删除所有格式规则并完全委托给外部格式化程序。 Prettier 显然是固执己见的,并不是每个人都会选择使用它。 这个问题仍然对 PR 开放。

这个问题是怎么回事?

我的公关正在进行中,在很多情况下,仍然需要时间。 @cyberhck

所以我们希望它很快就会合并:slightly_smiling_face:

这里有更新吗?

也许我们可以要求打字稿格式化程序维护人员公开几个 API? 该包已经可以验证整个源文件是否根据tslint.json文件中的设置进行了格式化

但是,使用 TSLint 的修复程序设置可能需要帮助。

问题似乎是只有在使用错误的空白字符时才会报告失败,而不是在缩进大小关闭的情况下。

@adidahiya如果使用了错误的缩进字符,我无法让它报告错误。 如果我将规则设置为空格 / 4 并具有以下内容:

export function foo() {
return 123;
}

要么

export function foo() {
<tab>return 123;
}

它不会报告错误。 根据您的原始评论,如果空格字符错误,您确定它会报告它吗?

这方面有什么进展吗? 只想问😝

建议? 使用更漂亮

有人试过tslint-eslint-rules吗?

@jscharett tslint-eslint-rules 使用ter-indent规则。 不幸的是,它不包括 JSX 缩进......

这里有修复的希望吗?

这个bug在v5.10.0中仍然没有修复

我得说,我不认为 TSLint 能够像 Prettier 一样格式化 JS 代码。 这是一个复杂的问题,Prettier 比任何人都更好地解决了这个问题。 我认为我们不应该为此依赖 TSLint,特别是因为项目经常同时使用这两种工具,并且很可能会出现冲突......

编辑:为了更好地了解这个问题的复杂程度,请查看此 PR ,或查看 Prettier 源代码。 如果这些演示没有让你觉得“复杂”,请通过 PR 帮助这个项目😄!

@aervin我倾向于不同意这里。 在我看来,这两个项目有不同的目的。 Prettier 属于格式化类别,而 TSLint 更符合验证。 是的,TSLint 可以为某些规则进行格式化,但它作为 linter 的预期目的可以追溯到验证。

依赖 Prettier 的问题在于它固执己见。 你同意它的风格很好,但如果你不同意怎么办? 我们以前都用过 JSLint,我们都抱怨,因为它太固执了。 然后是 JSHint 和 JSCS,它们给了我们一些控制权。 现在我们拥有强大的工具,例如@eslint ,它使我们能够即插即用并自动“修复”问题。

虽然我确信 Prettier 是一个伟大的项目,但我个人认为这是一种倒退。 它从我手中夺走了控制权。 TSLint 不需要“修复”代码,如果这是问题,只需将其标记为问题。 我不怀疑这个问题很复杂,但 eslint 解决了它。 规则曾经奏效; 什么改变打破它?

@jscharett感谢您的友好回应。 我同意这些项目有不同的目的,或者_应该_有。 我的论点是我们应该将这些项目限制在这些目的上。 让我们让 Prettier 解决缩进问题,让 TSLint 来警告开发人员有关可以简化的箭头函数。

我也同意 Prettier 是固执己见的。 我更喜欢关于 Prettier 的那一点。 现在我的团队不必讨论谁的格式意见更合理。 我们都可以抱怨 Prettier :laughing: 。

编辑:

规则曾经奏效; 什么改变打破它?

开篇的问题评论让我相信这条规则从来没有按预期工作。

虽然我确信 Prettier 是一个伟大的项目,但我个人认为这是一种倒退。 它从我手中夺走了控制权。

我的经验是,在我添加 Prettier 之前,我认为我关心对格式规则的细粒度控制......不久之后我意识到我并不关心事物的特定格式化方式,因为事实上它们的格式一致。 这是一个巨大的认知负担,不用再担心了,完全专注于我希望代码_做什么_而不是它的外观。

tslint 已经验证了属于格式类别的其他内容。 例如,强制对齐、括号样式或变量名称和运算符之间的空格。 此外,希望能够验证缩进而不必依赖像 prettier 这样的固执己见的解决方案。

需要更少的讨论,更多的公关。 😉😉

继续@ffxsam

我的评论大多是半开玩笑的。 虽然我想知道为什么这个问题已经一年多了,但没有取得任何进展。 似乎每个人都在争论 linting 与 Prettier。

@ffxsam因为关于 tslint 是更多关于 ts 部分还是关于 lint 部分存在争议

这是一个有效的观点。 似乎与 TSLint/ESLint 有一些重叠。 但事实仍然是,有一个不工作的indent选项已经被破坏了多久。 似乎最快/最简单的事情是让熟悉 TSLint 代码库的人修复它......?

投票修复x spaces => y spaces 。 这是我们公司非常依赖的功能。 不解决这个问题是没有意义的。

@ffxsam我看这个问题已经快一年了,是的,已经很久了,但是正如你所看到的,有两次公关尝试,直到现在都没有成功,我认为这比看起来更难,但是当然对于维护者来说可能更容易,我只是有很多耐心:slightly_smiling_face:

在空项目中仍然可以重现
https://github.com/dimaShin/tslint-reproduce-2814

@dimaShin ,感谢您花时间创建一个可重现的存储库。 然而团队已经意识到这个问题,复制从来都不是问题。

我们只是在等待这个功能,可能有修复选项,但这对我来说不是问题。 上次我检查人们使用 prettier 来检查缩进和 tslint 以检查其他所有内容。

我并不是说这很适合你,对我来说当然不是,我还建议对这个特定选项使用.editorconfig并在解决这个问题后切换到 tslint。

再次感谢您花时间添加更多信息:)

让我们确定一个检查缩进的策略。 作为参考,这里是 eslint 使用的策略:

  1. OffsetStorage 实例存储所需偏移量的映射,其中每个令牌都具有与另一个指定令牌或到第一列的指定偏移量。
  2. 在遍历 AST 时,相应地修改所需的令牌偏移量。 例如,在输入 BlockStatement 时,将 BlockStatement 中的所有标记从 BlockStatement 的左花括号偏移 1 个缩进级别。
  3. 遍历 AST 后,根据 OffsetStorage 容器计算每个令牌的预期缩进级别。
  4. 对于每一行,将第一个标记的预期缩进与文件中的实际缩进进行比较,如果两个值不相等,则报告该标记。

这种策略基于语法,根据之前的评论,语法过于自以为是,因为它需要以某种方式断行。 我提出了一种检查缩进的简单方法,该方法与代码如何分解为行无关:

  1. 缩进单位在设置中定义。 对于制表符,它是一个制表符。 对于空格,它是两个或四个空格字符。
  2. 文件的第一个非空行应该有零个缩进单位
  3. 每个后续的非空行都应该有
    一种。 与前面的非空行相同的缩进单位数或
    湾少于前一个非空行的缩进单位数或
    C。 比前一行非空行的缩进单位数正好多一个

一些额外的事情要讨论:

  • size 参数对制表符没有影响(为什么?)
  • 没有理由 size 参数不能是任何正整数
  • 如果不走语法策略路线,可能无法实现自动修复缩进大小

@stifflerus同样规则应该与 if/for/arrow 函数一起使用,而没有 {} 块

@maximelkin你给出的例子在第二行没有缩进吗? 你能举一个例子说明所提议的策略在哪里失败吗?

if(this) that(); //okay because it's all one line

if(this)
  that(); //also okay because the second line is indented

let x = () => f(); //okay because it's all one line

let y = () =>
  f(); // I have not seen any code but like this but it would be okay

如果这被修复了会很棒。

我不敢相信像强制缩进规则这样基本的东西仍然不起作用。

那么,有没有办法在 2018 年 lint 这样的 ts-code?

const x = {
  a: 1,
   b: 2,
}

为我工作
./.eslintrc.ts.js

module.exports = {
  'parser': 'typescript-eslint-parser',
  'parserOptions': {
    'ecmaVersion': 6,
    'sourceType': 'module',
    'ecmaFeatures': {
      'jsx': true,
    }
  },
  'plugins': [
    'react',
  ],
  'rules': {
    'indent': ['error', 2],
  },
}

yarn eslint --no-eslintrc --config ./.eslintrc.ts.js --ext .tsx src

https://github.com/eslint/typescript-eslint-parser

我为 angular 中的缩进问题找到的解决方案是通过以下步骤添加更漂亮
npm install --save-dev tslint-plugin-prettier 更漂亮的 tslint-jasmine-rules
编辑 tslint.json -->
`“规则目录”:[
"node_modules/codelyzer",
"node_modules/tslint-plugin-prettier",
“node_modules/tslint-jasmine-rules/dist”

],
"extends": "tslint-plugin-prettier",

“规则”:{
“更漂亮”:真的,
//在这里添加你想要的规则`

并在 packege.json 添加 -->
“,”更漂亮”:{
“单引号”:真,
“打印宽度”:140,
“半”:真的,
“括号间距”:真,
"arrowParens": "总是",
“解析器”:“打字稿”
}"

这是几乎每个人每天都会使用的功能。 如果这个问题得到更多关注,将不胜感激。

伙计们,您可以使用 tslint-eslint-rules 提供的ter-indent选项。

"ter-indent": [ true, 4, { "SwitchCase": 1 }]

它对我有用。 干杯!

@hiteshaleriya这就是我在我的项目中已经有一段时间了,但它实际上并没有修复错误,只是让它们沉默......这是我的tslint.json

{
    "extends": "tslint-config-airbnb",
    "rules": {
        "ter-indent": ["error", "spaces", 4],
        "no-unused-vars": ["warn"],
        "no-multi-spaces": false,
        "no-console": false,
        "max-line-length": false,
        "import-name": false
    }
}

这是一个相关示例,该示例完成后未引起警告或错误:

function retrieveAndSetConfig(): Promise<any> {
  return new Promise((resolve, _) => {
  // ^ 2 spaces, expected 4
    const ghe = new GHEUtils();
    // ^ 4 spaces, expected 8
    // ...
}

使用制表符时也不会显示错误(尽管当存在 4 个空格时,这可能是设计使然?)。

@SpencerKaiser您能否更新您的三缩进规则,如下所示,然后尝试:

"ter-indent": [true, 4]

我试过你的例子,它在我结束时按预期工作(导致错误)。

@hiteshaleriya感谢您这么快回复我! 所以它现在按预期抛出错误 (👍) 但它没有用--fix修复它们中的任何一个。 有任何想法吗?

@SpencerKaiser您可以尝试运行 --fix 命令两次吗? 第一次它只会缩进第一行然后第二次它会缩进其余部分(对于您的示例代码)。 看起来很奇怪,但如果它不起作用,请报告问题。

@hiteshaleriya所以有一些观察......我不需要再次运行它,我需要运行它大约n/4次,其中n是空格中缩进的长度项目中最远的缩进线¯\_(ツ)_/¯

在最终完成所有这些之后,它似乎跳过了这样的基本缩进错误:

class Something {
    function myFunc() {
        const myThing = {
            wat: 1,
         wattt: 5,    // 9 spaces, expected 12
        };
    }
}

如果我将const (第 17 行)的缩进级别弄乱为 0 个空格,则其余部分会被标记为错误 _排除_当我离开--fix时带有空格的行:

ERROR: 17:1  ter-indent  Expected indentation of 8 spaces but found 0.
ERROR: 18:1  ter-indent  Expected indentation of 4 spaces but found 12.
ERROR: 20:1  ter-indent  Expected indentation of 0 spaces but found 8.

使用--fix ,这是第一遍:

        const myThing = {
    wat: 1,
         wattt: 5,
};

第二遍:

        const myThing = {
            wat: 1,
         wattt: 5,
        };

想法??

@shubich我最终做了同样的事情......

有任何更新吗?

@MaKCbIMKo据我所知,整个团队将开始整合 eslint 访问 typescript-eslint,并且在不久的将来 tslint 将被弃用,所以现在忽略这条规则就好了(或使用 tslint-config-prettier )

由于此任务的复杂性和项目方向的变化而关闭:#4534

来自 typescript -eslint 的ESLint 规则对我来说非常适用(参见 #4534):

module.exports = {
    "env": {
        "browser": true,
    },
    "parser": "@typescript-eslint/parser",
    "parserOptions": {
        "ecmaVersion": 2019,
        "sourceType": "module",
        "ecmaFeatures": {
            "jsx": true
        },
        "project": "./tsconfig.json",
    },
    "plugins": ["@typescript-eslint"],
    "rules": {
        "@typescript-eslint/indent": ["error", 2] // or ["error", "tab"]
    }
}

🤖 哔哔! 👉 TSLint 已弃用👈,您应该切换到typescript-eslint ! 🤖

🔒 此问题已被锁定,以防止进一步不必要的讨论。 谢谢! 👋

PS tslint-config-prettier - 请停止使用 _linters_(例如 TSLint)来 _format_ 你的 TypeScript。 这是更好地利用_formatter_这样做的更漂亮

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