🎃

ESLint : TSLint からの代替ルール

2024/09/22に公開

see: TSLint Rule Alternatives

この文書は、TSLintからの移行を支援するためのガイドです。すべてのTSLintルールを、同じまたは類似のESLintエコシステムのルールと並べて一覧にしています。

TSLintの設定を最も近いESLintの設定に移行するツールについては、tslint-to-eslint-configを参照してください。

TSLint rules

✅ = 完了
🌟 = ESLintコアに含まれている
🔌 = 別のプラグインに含まれている
🌓 = 実装が異なるか、ESLintのバージョンに機能が不足している
🛑 = 未実装

TypeScript専用

TSLint rule ESLint rule
[adjacent-overload-signatures] [@typescript-eslint/adjacent-overload-signatures]
[ban-ts-ignore] [@typescript-eslint/ban-ts-comment]
[ban-types] 🌓 [@typescript-eslint/no-restricted-types][1]
[invalid-void] [@typescript-eslint/no-invalid-void-type]
[member-access] [@typescript-eslint/explicit-member-accessibility]
[member-ordering] [@typescript-eslint/member-ordering]
[no-any] [@typescript-eslint/no-explicit-any]
[no-empty-interface] [@typescript-eslint/no-empty-object-type]
[no-import-side-effect] 🔌 [import/no-unassigned-import]
[no-inferrable-types] [@typescript-eslint/no-inferrable-types]
[no-internal-module] [@typescript-eslint/prefer-namespace-keyword]
[no-magic-numbers] [@typescript-eslint/no-magic-numbers]
[no-namespace] [@typescript-eslint/no-namespace]
[no-non-null-assertion] [@typescript-eslint/no-non-null-assertion]
[no-parameter-reassignment] [no-param-reassign][no-param-reassign]
[no-reference] [@typescript-eslint/triple-slash-reference]
[no-unnecessary-type-assertion] [@typescript-eslint/no-unnecessary-type-assertion]
[no-var-requires] [@typescript-eslint/no-var-requires]
[only-arrow-functions] 🔌 [prefer-arrow/prefer-arrow-functions]
[prefer-for-of] [@typescript-eslint/prefer-for-of]
[promise-function-async] [@typescript-eslint/promise-function-async]
[typedef-whitespace] [@typescript-eslint/type-annotation-spacing]
[typedef] [@typescript-eslint/typedef]
[unified-signatures] [@typescript-eslint/unified-signatures]

機能や特性

TSLint rule ESLint rule
[await-promise] [@typescript-eslint/await-thenable]
[ban-comma-operator] 🌟 [no-sequences][no-sequences]
[ban] 🌟 [no-restricted-globals][no-restricted-globals] & [no-restricted-properties][no-restricted-properties]
[curly] 🌟 [curly][curly]
[forin] 🌟 [guard-for-in][guard-for-in]
[function-constructor] 🌟 [no-new-func][no-new-func]
[import-blacklist] 🌟 [no-restricted-imports][no-restricted-imports]
[label-position] 🌟 [no-unused-labels][no-unused-labels] (similar)
[no-arg] 🌟 [no-caller][no-caller] (also blocks arguments.caller)
[no-async-without-await] [@typescript-eslint/require-await]
[no-bitwise] 🌟 [no-bitwise][no-bitwise]
[no-conditional-assignment] 🌟 [no-cond-assign][no-cond-assign][2]
[no-console] 🌟 [no-console][no-console] (configuration works slightly differently)
[no-construct] 🌟 [no-new-wrappers][no-new-wrappers]
[no-debugger] 🌟 [no-debugger][no-debugger]
[no-duplicate-super] 🌟 [constructor-super][constructor-super]
[no-duplicate-switch-case] 🌟 [no-duplicate-case][no-duplicate-case]
[no-duplicate-variable] 🌟 [no-redeclare][no-redeclare]
[no-dynamic-delete] [@typescript-eslint/no-dynamic-delete]
[no-empty] 🌟 [no-empty][no-empty]
[no-eval] 🌟 [no-eval][no-eval]
[no-floating-promises] [@typescript-eslint/no-floating-promises]
[no-for-in-array] [@typescript-eslint/no-for-in-array]
[no-implicit-dependencies] 🔌 [import/no-extraneous-dependencies]
[no-inferred-empty-object-type] 🛑 N/A
[no-invalid-template-strings] 🌟 [no-template-curly-in-string][no-template-curly-in-string]
[no-invalid-this] 🌟 [no-invalid-this][no-invalid-this]
[no-misused-new] [@typescript-eslint/no-misused-new]
[no-null-keyword] 🔌 [no-null/no-null] (doesn’t handle null type)
[no-null-undefined-union] 🛑 N/A
[no-object-literal-type-assertion] [@typescript-eslint/consistent-type-assertions]
[no-promise-as-boolean] [@typescript-eslint/no-misused-promises]
[no-restricted-globals] [no-restricted-globals][no-restricted-globals]
[no-return-await] 🌟 [no-return-await][no-return-await]
[no-shadowed-variable] 🌟 [no-shadow][no-shadow]
[no-sparse-arrays] 🌟 [no-sparse-arrays][no-sparse-arrays]
[no-string-literal] 🌟 [dot-notation][dot-notation]
[no-string-throw] [@typescript-eslint/only-throw-error]
[no-submodule-imports] 🌓 [import/no-internal-modules] (slightly different)
[no-switch-case-fall-through] 🌟 [no-fallthrough][no-fallthrough]
[no-tautology-expression] 🛑 N/A
[no-this-assignment] [@typescript-eslint/no-this-alias]
[no-unbound-method] [@typescript-eslint/unbound-method]
[no-unnecessary-class] [@typescript-eslint/no-extraneous-class]
[no-unsafe-any] 🌓 [@typescript-eslint/no-unsafe-member-access][3]
[no-unsafe-finally] 🌟 [no-unsafe-finally][no-unsafe-finally]
[no-unused-expression] 🌟 [no-unused-expressions][no-unused-expressions]
[no-unused-variable] 🌓 [@typescript-eslint/no-unused-vars]
[no-use-before-declare] [@typescript-eslint/no-use-before-define]
[no-var-keyword] 🌟 [no-var][no-var]
[no-void-expression] [@typescript-eslint/no-confusing-void-expression]
[prefer-conditional-expression] 🛑 N/A
[prefer-object-spread] 🌟 [prefer-object-spread][prefer-object-spread]
[radix] 🌟 [radix][radix]
[restrict-plus-operands] [@typescript-eslint/restrict-plus-operands]
[static-this] 🛑 N/A
[strict-boolean-expressions] [@typescript-eslint/strict-boolean-expressions]
[strict-string-expressions] [@typescript-eslint/restrict-plus-operands] & [@typescript-eslint/restrict-template-expressions]
[strict-type-predicates] 🛑 N/A
[switch-default] 🌟 [default-case][default-case]
[triple-equals] 🌟 [eqeqeq][eqeqeq]
[typeof-compare] 🌟 [valid-typeof][valid-typeof]
[unnecessary-constructor] 🌟 [no-useless-constructor][no-useless-constructor]
[use-default-type-parameter] [@typescript-eslint/no-unnecessary-type-arguments]
[use-isnan] 🌟 [use-isnan][use-isnan]

メンテナビリティ

TSLint rule ESLint rule
[cyclomatic-complexity] 🌟 [complexity][complexity]
[deprecation] [@typescript-eslint/no-deprecated]
[eofline] 🌟 [eol-last][eol-last]
[indent] [@typescript-eslint/indent] or [Prettier]
[linebreak-style] 🌟 [linebreak-style][linebreak-style] or [Prettier]
[max-classes-per-file] 🌟 [max-classes-per-file][max-classes-per-file]
[max-file-line-count] 🌟 [max-lines][max-lines]
[max-line-length] 🌟 [max-len][max-len] or [Prettier]
[no-default-export] 🔌 [import/no-default-export]
[no-default-import] 🛑 N/A
[no-duplicate-imports] 🔌 [import/no-duplicates]
[no-mergeable-namespace] 🛑 N/A
[no-require-imports] [@typescript-eslint/no-require-imports]
[object-literal-sort-keys] 🌓 [sort-keys][sort-keys][4]
[prefer-const] 🌟 [prefer-const][prefer-const]
[prefer-readonly] [@typescript-eslint/prefer-readonly]
[trailing-comma] 🌓 [comma-dangle][comma-dangle] or [Prettier]

スタイル

TSLint rule ESLint rule
[align] 🛑 N/A
[array-type] [@typescript-eslint/array-type]
[arrow-parens] 🌟 [arrow-parens][arrow-parens]
[arrow-return-shorthand] 🌟 [arrow-body-style][arrow-body-style]
[binary-expression-operand-order] 🌟 [yoda][yoda]
[callable-types] [@typescript-eslint/prefer-function-type]
[class-name] [@typescript-eslint/naming-convention]
[comment-format] 🌟 [capitalized-comments][capitalized-comments] & [spaced-comment][spaced-comment]
[comment-type] 🛑 N/A
[completed-docs] 🔌 [jsdoc/require-jsdoc]
[encoding] 🛑 N/A
[file-header] 🔌 [eslint-plugin-header][plugin:header] or [-file-header][plugin:file-header]
[file-name-casing] 🔌 [unicorn/filename-case]
[import-spacing] 🔌 Use [Prettier]
[increment-decrement] 🌟 [no-plusplus][no-plusplus]
[interface-name] [@typescript-eslint/interface-name-prefix]
[interface-over-type-literal] [@typescript-eslint/consistent-type-definitions]
[jsdoc-format] 🌓 [valid-jsdoc][valid-jsdoc] or [eslint-plugin-jsdoc][plugin:jsdoc]
[match-default-export-name] 🛑 N/A
[newline-before-return] 🌟 [padding-line-between-statements][padding-line-between-statements][5]
[newline-per-chained-call] 🌟 [newline-per-chained-call][newline-per-chained-call]
[new-parens] 🌟 [new-parens][new-parens]
[no-angle-bracket-type-assertion] [@typescript-eslint/consistent-type-assertions]
[no-boolean-literal-compare] [@typescript-eslint/no-unnecessary-boolean-literal-compare]
[no-consecutive-blank-lines] 🌟 [no-multiple-empty-lines][no-multiple-empty-lines]
[no-irregular-whitespace] 🌟 [no-irregular-whitespace][no-irregular-whitespace] with skipStrings: false
[no-parameter-properties] [@typescript-eslint/parameter-properties]
[no-redundant-jsdoc] 🔌 [jsdoc/no-types]
[no-reference-import] [@typescript-eslint/triple-slash-reference]
[no-trailing-whitespace] 🌟 [no-trailing-spaces][no-trailing-spaces]
[no-unnecessary-callback-wrapper] 🛑 N/A and this might be unsafe (i.e. with forEach)
[no-unnecessary-else] 🌟 [no-else-return][no-else-return][6]
[no-unnecessary-initializer] 🌟 [no-undef-init][no-undef-init]
[no-unnecessary-qualifier] [@typescript-eslint/no-unnecessary-qualifier]
[number-literal-format] 🛑 N/A
[object-literal-key-quotes] 🌟 [quote-props][quote-props]
[object-literal-shorthand] 🌟 [object-shorthand][object-shorthand]
[one-line] 🌟 [brace-style][brace-style] or [Prettier]
[one-variable-per-declaration] 🌟 [one-var][one-var]
[ordered-imports] 🌓 [import/order]
[prefer-function-over-method] 🌟 [@typescript-eslint/class-methods-use-this]
[prefer-method-signature] [@typescript-eslint/method-signature-style]
[prefer-switch] 🛑 N/A
[prefer-template] 🌟 [prefer-template][prefer-template]
[prefer-while] 🛑 N/A
[quotemark] 🌟 [quotes][quotes]
[return-undefined] 🛑 N/A
[semicolon] 🌓 [@typescript-eslint/semi]
[space-before-function-paren] 🌟 [space-before-function-paren][space-after-function-paren]
[space-within-parens] 🌟 [space-in-parens][space-in-parens]
[switch-final-break] 🛑 N/A
[type-literal-delimiter] [@typescript-eslint/member-delimiter-style]
[unnecessary-bind] 🌟 [no-extra-bind][no-extra-bind]
[variable-name] [@typescript-eslint/naming-convention]
[whitespace] 🔌 Use [Prettier]

tslint-microsoft-contrib ルール

ルールの一覧は こちらです。
非推奨のルールは除外されています (missing-jsdoc, missing-optional-annotation, no-duplicate-case, no-duplicate-parameter-names, no-function-constructor-with-string-args, no-increment-decrement, no-empty-interfaces, no-missing-visibility-modifiers, no-multiple-var-decl, no-reserved-keywords, no-stateless-class, no-var-self, no-unnecessary-bind, and valid-typeof) 代わりに何を使用するかについては、上記のリンクのドキュメントを参照してください。

テスト

関連するプラグイン: chai-expect-keywords, chai-expect, chai-friendly, mocha, and jest

tslint-microsoft-contrib rule ESLint rule
chai-prefer-contains-to-index-of 🛑 N/A
chai-vague-errors 🛑 N/A
mocha-avoid-only 🔌 [jest/no-focused-tests]
mocha-unneeded-done 🛑 N/A

TypeScript

tslint-microsoft-contrib rule ESLint rule
prefer-array-literal 🌓 [@typescript-eslint/no-array-constructor][7]
prefer-type-cast 🛑 N/A

その他

tslint-microsoft-contrib rule ESLint rule
export-name 🛑 N/A ([relevant plugin][plugin:import])
function-name 🛑 N/A
import-name 🛑 N/A ([relevant plugin][plugin:import])
informative-docs 🛑 N/A
max-func-body-length 🌟 [max-statements][max-statements]
no-banned-terms 🌟 [no-caller][no-caller] & [no-eval][no-eval]
no-constant-condition 🌟 [no-constant-condition][no-constant-condition]
no-control-regex 🌟 [no-control-regex][no-control-regex]
no-delete-expression [@typescript-eslint/no-dynamic-delete]
no-empty-line-after-opening-brace 🌟 [padded-blocks][padded-blocks] [8] or [Prettier]
no-for-in 🌟 [no-restricted-syntax][no-restricted-syntax] [9]
no-function-expression 🌟 [func-style][func-style] [10]
no-invalid-regexp 🌟 [no-invalid-regexp][no-invalid-regexp]
no-multiline-string 🌟 [no-multi-str][no-multi-str]
no-octal-literal 🌟 [no-octal-escape][no-octal-escape], see also [no-octal][no-octal]
no-regex-spaces 🌟 [no-regex-spaces][no-regex-spaces]
no-relative-imports 🛑 N/A, Not recommended by the maintainers
no-single-line-block-comment 🛑 N/A
no-suspicious-comment 🌟 [no-warning-comments][no-warning-comments] [11]
no-typeof-undefined 🛑 N/A (this actually has a valid use: checking if a variable is defined)
no-unexternalized-strings 🛑 N/A
no-unnecessary-field-initialization 🌓 [no-undef-init][no-undef-init] [12]
no-unnecessary-local-variable 🛑 N/A
no-unnecessary-override 🛑 N/A
no-unnecessary-semicolons 🌟 [no-extra-semi][no-extra-semi] or [Prettier]
no-useless-files 🛑 N/A
no-with-statement 🌟 [no-with][no-with]
promise-must-complete 🛑 N/A
underscore-consistent-invocation 🔌 [lodash/chaining]
use-named-parameter 🛑 N/A
use-simple-attributes 🛑 N/A

セキュリティ

tslint-microsoft-contrib rule ESLint rule
insecure-random 🔌 [desktop/insecure-random] or [@microsoft/sdl/no-insecure-random]
no-disable-auto-sanitization 🔌 [@microsoft/sdl/no-msapp-exec-unsafe] and [@microsoft/sdl/no-winjs-html-unsafe]
no-document-domain 🌓 Use [no-restricted-syntax][no-restricted-syntax] or [@microsoft/sdl/no-document-domain]
no-http-string 🔌 [@microsoft/sdl/no-insecure-url]
no-inner-html 🔌 [@microsoft/sdl/no-inner-html] and [@microsoft/sdl/no-html-method]
no-string-based-set-immediate 🌓 [@typescript-eslint/no-implied-eval]
no-string-based-set-interval 🌓 [@typescript-eslint/no-implied-eval]
no-string-based-set-timeout 🌓 [@typescript-eslint/no-implied-eval]
react-anchor-blank-noopener 🔌 [react/jsx-no-target-blank]
react-iframe-missing-sandbox 🔌 [@microsoft/sdl/react-iframe-missing-sandbox]
react-no-dangerous-html 🔌 [react/no-danger]
non-literal-fs-path 🔌 [security/detect-non-literal-fs-filename]
non-literal-require 🔌 [security/detect-non-literal-require]
possible-timing-attack 🔌 [security/detect-possible-timing-attacks]

ブラウザー

tslint-microsoft-contrib rule ESLint rule
jquery-deferred-must-complete 🛑 N/A
no-backbone-get-set-outside-model 🛑 N/A
no-cookies 🌓 Use [no-restricted-syntax][no-restricted-syntax] or [@microsoft/sdl/no-cookies]
no-document-write 🌓 Use [no-restricted-syntax][no-restricted-syntax] or [@microsoft/sdl/no-document-write]
no-exec-script 🌓 Use [no-restricted-syntax][no-restricted-syntax] or [@typescript-eslint/no-implied-eval]
no-jquery-raw-elements 🛑 N/A
no-unsupported-browser-code 🛑 N/A
react-this-binding-issue 🛑 N/A
react-tsx-curly-spacing 🔌 [react/jsx-curly-spacing]
react-unused-props-and-state 🌓 [react/no-unused-state]

React A11y[13]

tslint-microsoft-contrib rule ESLint rule
react-a11y-accessible-headings 🌓 [jsx-a11y/heading-has-content] [14]
react-a11y-anchors 🔌 [jsx-a11y/anchor-is-valid]
react-a11y-aria-unsupported-elements 🔌 [jsx-a11y/aria-unsupported-elements]
react-a11y-event-has-role 🌓 [jsx-a11y/no-static-element-interactions] [15]
react-a11y-image-button-has-alt 🔌 [jsx-a11y/alt-text]
react-a11y-img-has-alt 🔌 [jsx-a11y/alt-text]
react-a11y-input-elements 🛑 N/A
react-a11y-lang 🔌 [jsx-a11y/lang]
react-a11y-meta 🛑 N/A
react-a11y-no-onchange 🔌 [jsx-a11y/no-onchange]
react-a11y-props 🔌 [jsx-a11y/aria-props]
react-a11y-proptypes 🔌 [jsx-a11y/aria-proptypes]
react-a11y-required 🛑 N/A
react-a11y-role-has-required-aria-props 🔌 [jsx-a11y/role-has-required-aria-props]
react-a11y-role-supports-aria-props 🔌 [jsx-a11y/role-supports-aria-props]
react-a11y-role 🔌 [jsx-a11y/aria-role]
react-a11y-tabindex-no-positive 🔌 [jsx-a11y/tabindex-no-positive]
react-a11y-titles 🛑 N/A
脚注
  1. ESLintルールは、正規表現ではなく、正確な文字列マッチングのみをサポートしています。 ↩︎

  2. ESLintルールは、追加の括弧を使ってサイレンシングをサポートしています(if ((foo = bar)) {}) ↩︎

  3. メンバー式のみをチェックします ↩︎

  4. 空行で区切られたセクションのサポートが欠如している ↩︎

  5. 推奨設定: ["error", { blankLine: "always", prev: "*", next: "return" }] ↩︎

  6. break や continue などの他の制御フロー文はチェックしません。 ↩︎

  7. ESLintのルールはやや厳しさが緩和されており、new Array<Foo>()やArray(2)が許可されています。 ↩︎

  8. ブロックの先頭と末尾に空行を強制します。 ↩︎

  9. 推奨設定:["error", "ForInStatement"] ↩︎

  10. 推奨設定: ["error", "declaration", { "allowArrowFunctions": true }] ↩︎

  11. 推奨設定: ["error", { "terms": ["BUG", "HACK", "FIXME", "LATER", "LATER2", "TODO"], "location": "anywhere" }] ↩︎

  12. クラスフィールドはチェックしません。 ↩︎

  13. アクセシビリティ ↩︎

  14. TSLintのルールはより厳格です ↩︎

  15. ESLintのルールはクリックハンドラーに対してのみ報告します ↩︎

Discussion