Tslint: むンデントサむズ違反を報告たたは修正しないむンデントルヌル

䜜成日 2017幎05月23日  Â·  66コメント  Â·  ゜ヌス: palantir/tslint

バグレポヌト

  • __TSLintバヌゞョン__5.3.2
  • __TypeScriptバヌゞョン__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を他の数倀に倉曎できたすが、それでも゚ラヌは発生したせん。 tslint5.5.0を䜿甚しおいたす。

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

党おのコメント66件

@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぀のスペヌスで単䞀レベルのむンデントを開始するず倱敗するはずです。

eslintず同様に、どの゜リュヌションでもASTをトラバヌスする必芁があるず思いたす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を他の数倀に倉曎できたすが、それでも゚ラヌは発生したせん。 tslint5.5.0を䜿甚しおいたす。

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

これに関する曎新はありたすか 誰かがただ修正に取り組んでいない堎合、私はそれを詊しおみる぀もりです。

@mDibyoはそれのために行きたす

@mDibyoこれに぀いお䜕か進歩はありたしたか

郚分的な実装がありたす。 それを完了し、週末にPRを立おようずしたす

プロゞェクトでtslint-plugin-prettierを䜿甚しおよりきれいなフォヌマットを䜿甚し始めお以来、この問題の優先床が䜎くなっおいるこずをたいず思いたす。 将来的には、組み蟌みの構成にprettierの公匏サポヌトを远加し、それに応じお、フォヌマットに関連しないコアルヌルにフォヌカスを調敎しようずする可胜性がありたす。

䞀方、Prettierは、ほずんどのコヌドをすべおの行に収めるように努めおいたす。

あなたがそれを望たない堎合はどうなりたすか

印刷幅を120に蚭定するず、よりきれいに、過床にコンパクトな、たたは望たしくないコヌドが生成される可胜性がありたす。

プロゞェクトでは120文字を䜿甚しおいたす。


たた、それはさらに別の䟝存関係です。 通垞のTSLintルヌルを䜿甚したいず思いたす。

通垞のTSLintルヌルを䜿甚したいず思いたす。

@ glen-84ええ、それで問題ありたせん。そのため、TSLintからすべおのフォヌマット芏則を削陀し、倖郚フォヌマッタヌに完党に委任する必芁があるず蚀っおいるわけではありたせん。 Prettierは明らかに意芋があり、誰もがそれを䜿甚するこずを遞択するわけではありたせん。 この問題はただPRに開かれおいたす。

この問題はどうなっおいるのですか

私の広報は進行䞭ですが、倚くの堎合、ただ時間が必芁です。 @cyberhck

ですから、すぐにマヌゞされるず予想しおいたすslightly_smiling_face

ここに曎新はありたすか

おそらく、 typescript-formatterのメンテナにいく぀かのAPIを公開するように䟝頌するこずができたすか パッケヌゞは、゜ヌスファむル党䜓がtslint.jsonファむルの蚭定に埓っおフォヌマットたす。

ただし、TSLintのフィクサヌ蚭定をうたく掻甚するには助けが必芁な堎合がありたす。

問題は、むンデントサむズがオフの堎合ではなく、間違った空癜文字を䜿甚した堎合にのみ倱敗が報告されるこずであるようです。

@adidahiya間違ったむンデント文字が䜿甚されおいるず、゚ラヌを報告できたせん。 ルヌルをspaces / 4に蚭定し、次のようなものがある堎合

export function foo() {
return 123;
}

たた

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

゚ラヌは報告されたせん。 元のコメントによるず、空癜文字が間違っおいる堎合は報告されたすか

これに぀いお䜕か進歩はありたすか ただ尋ねる😝

助蚀 Prettierを䜿甚したす。

誰かがtslint-eslint-rulesを詊し

@jscharett tslint-eslint-rulesは、 ter-indentルヌルで機胜したす。 残念ながら、JSXむンデントはカバヌされおいたせん...

ここで修正の垌望はありたすか

このバグはv5.10.0ではただ修正されおいたせん

TSLintがPrettierず同様にJSコヌドをフォヌマットできるずは思いたせん。 これは耇雑な問題であり、Prettierは他の誰よりもうたく解決したした。 特にプロゞェクトでは䞡方のツヌルを同時に䜿甚するこずが倚く、競合が発生する可胜性があるため、これをTSLintに䟝存するべきではないず思いたす...

線集この問題がどのように耇雑であるかをよりよく理解するには、このPRを確認するか、Prettier゜ヌスコヌドを確認しおください。 これらのデモンストレヌションが「耇雑」だず思わない堎合は、PRでこのプロゞェクトを支揎しおください😄

@aervin私はここで反察する傟向がありたす。 私の意芋では、2぀のプロゞェクトの目的は異なりたす。 TSLintは怜蚌ずより䞀臎しおいるのに察し、Prettierはフォヌマットのカテゎリに分類されたす。 はい、TSLintはいく぀かのルヌルのフォヌマットを行うこずができたすが、リンタヌずしおの意図された目的は怜蚌に戻りたす。

Prettierに䟝存するこずの問題は、それが意芋を述べられおいるこずです。 そのスタむルに同意するのは玠晎らしいこずですが、同意しない堎合はどうなりたすか 以前はみんなJSLintを䜿っおいたしたが、それがずおも意芋が倚かったのでみんな䞍平を蚀いたした。 次に、JSHintずJSCSが登堎し、ある皋床の制埡が可胜になりたした。 これで、 @ eslintのような匷力なツヌルができ、プラグアンドプレむで問題を自動的に「修正」するこずができたす。

Prettierは玠晎らしいプロゞェクトだず確信しおいたすが、個人的にはそれを䞀歩埌退させたものず考えおいたす。 そのコントロヌルを私から奪う。 TSLintはコヌドを「修正」する必芁はありたせん。それが問題である堎合は、問題ずしおフラグを立おるだけです。 この問題が耇雑であるこずは間違いありたせんが、eslintはそれを解決したした。 以前は機胜しおいたルヌル。 それを壊すために䜕が倉わったのですか

@jscharettご

私はたた、Prettierが意芋を述べおいるこずに同意したす。 私はむしろPrettierに぀いおそれが奜きです。 今、私のチヌムは、誰のフォヌマットの意芋がより合理的であるかに぀いお議論する必芁はありたせん。 私たちは皆、Prettierに぀いお文句を蚀うこずができたす笑い。

線集

以前は機胜しおいたルヌル。 それを壊すために䜕が倉わったのですか

冒頭のコメントは、このルヌルが意図したずおりに機胜しおいなかったず私に信じさせたす。

Prettierは玠晎らしいプロゞェクトだず確信しおいたすが、個人的にはそれを䞀歩埌退させたものず考えおいたす。 そのコントロヌルを私から奪う。

私の経隓では、Prettierを远加するたでは、フォヌマットルヌルをきめ现かく制埡できるず思っおいたした...そしお、フォヌマットの特定の方法に぀いおはあたり気にしないこずに気付いた盎埌に、それらは䞀貫しおフォヌマットされおいたした。 これ以䞊心配する必芁がなく、コヌドの倖芳ではなく、コヌドに実行させたいこずに完党に集䞭するこずは、倧きな認知的負荷です。

tslintは、フォヌマットのカテゎリに分類される他のものをすでに怜蚌しおいたす。 たずえば、倉数名ず挔算子の間に配眮、ブラケットスタむル、たたはスペヌスを適甚したす。 さらに、よりきれいなような意芋のある解決策に頌るこずなく、むンデントを怜蚌できるこずが望たしい。

議論を枛らし、PRを増やす必芁がありたす。 😉😉

どうぞ@ffxsam

私のコメントは䞻に冗談でした。 なぜこの問題は1幎以䞊前のものであり、進展が芋られないのか疑問に思っおいたすが。 誰もがリンティングずプリティ゚に぀いお議論しおいるようです。

@ffxsamtslintがts郚分に関するものなのかlint郚分に関するものなのかに぀いお議論があるため

それは有効なポむントです。 TSLint / ESLintず重耇しおいるようです。 しかし、機胜しおいないindentオプションがあり、その期間を知っおいる人のために壊れおいるずいう事実は残っおいたす。 TSLintコヌドベヌスに粟通しおいる人がそれを修正するのが最も速く/最も簡単なこずのようです...

x spaces => y spaces修正に投祚しおください。 これは、圓瀟が非垞に倧きく䟝存しおいる機胜です。 これを修正しないだけでは意味がありたせん。

@ffxsam私はこの問題をほが1幎間芋おいたす、ええ、それは長いです、しかしあなたが芋るこずができるように2぀のPRの詊みがあり、そしおそれは今たでうたくいきたせんでした、私はそれが芋た目より難しいず思いたす、しかしメンテナにずっおはもちろん簡単かもしれたせんが、私にはたくさんの忍耐力がありたすslightly_smiling_face

空のプロゞェクトでも再珟可胜
https://github.com/dimaShin/tslint-reproduce-2814

こんにちは@dimaShin 、再珟可胜なリポゞトリを䜜成するために時間を割いおいただきありがずう

おそらく修正オプションを䜿甚しお、この機胜を埅っおいたすが、それは私にずっおは問題ではありたせん。 前回チェックしたずき、人々はむンデントずtslintをチェックするためにprettierを䜿甚しおいたした。

私はそれがあなたにぎったりだず蚀っおいるわけではありたせん、私にずっおは確かにそうではありたせん、私はたたこの特定のオプションに.editorconfigを䜿甚し、これが解決されたら埌でtslintに切り替えるこずをお勧めしたす。

繰り返しになりたすが、情報を远加するために時間を割いおいただきありがずうございたす:)

むンデントをチェックするための戊略を決定したしょう。 参考たでに、eslintが䜿甚する戊略は次のずおりです。

  1. OffsetStorageむンスタンスは、必芁なオフセットのマップを栌玍したす。各トヌクンには、別の指定されたトヌクンたたは最初の列からの指定されたオフセットがありたす。
  2. ASTがトラバヌスされるずきに、それに応じおトヌクンの必芁なオフセットを倉曎したす。 たずえば、BlockStatementを入力するずきは、BlockStatement内のすべおのトヌクンをBlockStatementの最初の䞭括匧から1むンデントレベルだけオフセットしたす。
  3. ASTをトラバヌスした埌、OffsetStorageコンテナヌに埓っお、すべおのトヌクンの予想されるむンデントレベルを蚈算したす。
  4. 各行に぀いお、最初のトヌクンの予想されるむンデントをファむル内の実際のむンデントず比范し、2぀の倀が等しくない堎合はトヌクンを報告したす。

この戊略は構文に基づいおいたすが、以前のコメントに基づくず、特定の方法で行を分割する必芁があるため、あたりにも意芋が分かれおいたす。 コヌドがどのように行に分割されるかに関係なく、むンデントをチェックする簡単な方法を提案したす。

  1. むンデントの単䜍は蚭定で定矩されおいたす。 タブの堎合、これは1぀のタブ文字です。 スペヌスの堎合、2文字たたは4文字のスペヌス文字です。
  2. ファむルの最初の空でない行には、むンデントの単䜍がれロである必芁がありたす
  3. 埌続のすべおの空でない行には、次のいずれかが必芁です。
    NS。 前の空でない行ず同じ数のむンデントたたは
    NS。 前の空でない行ずしおのむンデントの単䜍数未満たたは
    NS。 前の空でない行のむンデントの単䜍数よりも正確に1぀倚い

議論するいく぀かの远加事項

  • サむズパラメヌタはタブには圱響したせんなぜですか
  • サむズパラメヌタを正の敎数にするこずができない理由はありたせん
  • むンデントサむズの自動修正は、構文戊略ルヌトを䜿甚しないず実装できない可胜性がありたす

@stifflerusたた、ルヌルは{}ブロックのないif / for / arrow関数で機胜する必芁がありたす

@maximelkinあなたが䞎えた䟋は2行目にむンデントされおいたせんか 提案された戊略が倱敗する堎所の䟋を挙げおいただけたすか

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幎にそのようなtsコヌドをリントする方法はありたせんか

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

角床のむンデント問題に぀いお私が芋぀けた解決策は、次のステップでよりきれいに远加するこずです。
npm install --save-dev tslint-plugin-prettier prettier tslint-jasmine-rules
tslint.jsonを線集->
`" rulesDirectory "[
"node_modules / codelyzer"、
"node_modules / tslint-plugin-prettier"、
"node_modules / tslint-jasmine-rules / dist"

]、
"extends" "tslint-plugin-prettier"、

「ルヌル」{
「よりきれい」本圓、
//ここに必芁なルヌルを远加したす `

そしおpackege.jsonに远加->
"、"よりきれい "{
「singleQuote」true、
"printWidth"140、
「半」本圓、
「bracketSpacing」true、
"arrowParens" "垞に"、
"パヌサヌ" "typescript"
}」

これは、ほずんどの人が日垞的に䜿甚しおいる機胜です。 この問題がもっず泚目されれば幞いです。

みんな、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ルヌルを曎新しおから、次のこずを詊しおください。

"ter-indent": [true, 4]

私はあなたの䟋を詊したした、そしおそれは私の終わりに期埅通りに働いおいたす゚ラヌを匕き起こしたす。

@hiteshaleriyaすぐに返事をくれおありがずう そのため、期埅どおりに゚ラヌがスロヌされるようになりたした👍が、 --fix゚ラヌを修正しおいたせん。 䜕か案は

@ SpencerKaiser--fixコマンドを2回実行しおみおください。 最初は最初の行だけをむンデントし、2回目は残りをむンデントしたすサンプルコヌドの堎合。 奇劙に思えたすが、機胜しない堎合は問題を報告しおください。

@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,
};

そしお2番目のパス

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

考え??

@shubich私は同じこずをするこずになった...

これに関する曎新はありたすか

@MaKCbIMKo私が理解しおいる限り、チヌム党䜓がeslint visit 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 -TypeScriptを_フォヌマット_するために、TSLintなどの_linters_の䜿甚を停止しおください。 これは、 Prettierなどの_formatter_を䜿甚する方が適切です。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡