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;
}
@adidahiya查看@nchen63 的评论。
来自@nchen63 :
它修复制表符 -> x 空格和 x 空格 -> 制表符,但不修复 x 空格 -> y 空格
不过它应该做x spaces
到y 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 -> spaces
或spaces -> tabs
性能造成轻微影响。 我们可以通过根据设置选择实现来解决这个问题,但我预计如果使用制表符和空格的组合,当前的实现将失败,在这种情况下,我们应该只使用基于 AST 的解决方案。
我认为至少在 eslint 实现中完成的一些 AST 工作可以由 typescript 的库直接处理,因此解决方案应该不会太难写。
我们当前的实现如何知道完全失败?
_技术上_不需要。 align
规则会阻止您编写这样的代码。 当然,我们也可以在indent
规则中遍历 AST。 我只关心indent
和align
某种组合允许我完成我在问题描述中写的内容。
对齐规则会阻止您编写这样的代码。
好的! 我在检查源代码时错过了这一点。 我也去那边顶一下。 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:
嗨@dimaShin ,感谢您花时间创建一个可重现的存储库。 然而团队已经意识到这个问题,复制从来都不是问题。
我们只是在等待这个功能,可能有修复选项,但这对我来说不是问题。 上次我检查人们使用 prettier 来检查缩进和 tslint 以检查其他所有内容。
我并不是说这很适合你,对我来说当然不是,我还建议对这个特定选项使用.editorconfig
并在解决这个问题后切换到 tslint。
再次感谢您花时间添加更多信息:)
让我们确定一个检查缩进的策略。 作为参考,这里是 eslint 使用的策略:
这种策略基于语法,根据之前的评论,语法过于自以为是,因为它需要以某种方式断行。 我提出了一种检查缩进的简单方法,该方法与代码如何分解为行无关:
一些额外的事情要讨论:
@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
我为 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_这样做的更漂亮。
最有用的评论
我遇到了同样的问题。 下面的规则将捕获正在使用的制表符而不是空格,但不会捕获错误数量的空格。 我可以将 2 更改为任何其他数字,但仍然没有错误。 我正在使用 tslint 5.5.0。