メインコンテンツまでスキップ

ESLint

ESLintはJavaScript、TypeScript用の静的解析ツールです。

潜在的な不具合の発見やベストプラティクスへの追従、コードスタイルの統一など様々なルールを設定できます。

ESLintの実行方法

CLI

以下のコマンドで実行できます。

npm run lint:es

オプションとして、--fixを指定することで、コードのスタイルなど機械的に修正可能なものは自動で修正してくれます。 このアプリでは、--fixを指定したnpm scriptを用意しています。

npm run fix:es

エディタ、IDE

エディタやIDEにプラグインなどを設定することで、コーディング中にルール違反した箇所を明示してくれます。

Visual Studio CodeでESLintを有効にする方法については、Visual Studio Code - Lint、フォーマッタを参照してください。

その他のエディタやIDEについては、ESLintの公式ページにあるIntegrations - Editorsを参照してください。

適用しているルール一覧

このアプリでは、ESLintのルールを.eslintrc.jsに定義しています。

基本的には、Expoが提供しているeslint-config-universeの設定をベースとしています。 その他、eslint-plugin-react-hooksなど、推奨ルールを提供しているプラグインの設定も取り込んでいます。

ただし、一部のルールについては、推奨設定から変更しています。変更したルールについては、以降に記載するルール一覧の該当箇所に理由を記載しているので、そちらを参照してください。

適用している全てのルールは以下のとおりです。

注記

ESLintのCLIで--print-configオプションを指定すると、適用されているルールを確認できます。

以下の例では、src/apps/app/App.tsxに適用されているルールの一覧などが表示されます。

npx eslint --print-config src/apps/app/App.tsx

@typescript-eslint

TypeScriptに特化したルールを提供するプラグインです。

ルールレベル推奨設定からの変更
@typescript-eslint/array-typewarn-
@typescript-eslint/await-thenableerror-
@typescript-eslint/ban-ts-commenterror推奨設定ではこのルールはoffになっています。

しかし、このアプリではts-checkts-expect-errorだけを使用できるようにこのルールを設定しています。ts-ignoreを除外している理由は、チェック対象外にする方法 - TypeScriptを参照してください。
@typescript-eslint/ban-typeserror-
@typescript-eslint/consistent-type-assertionswarn-
@typescript-eslint/no-array-constructorerror-
@typescript-eslint/no-base-to-stringerror-
@typescript-eslint/no-dupe-class-memberswarn-
@typescript-eslint/no-duplicate-enum-valueserror-
@typescript-eslint/no-duplicate-type-constituentserror-
@typescript-eslint/no-explicit-anyerror-
@typescript-eslint/no-extra-non-null-assertionerror-
@typescript-eslint/no-floating-promiseserror-
@typescript-eslint/no-implied-evalerror-
@typescript-eslint/no-loss-of-precisionerror-
@typescript-eslint/no-misused-newerror-
@typescript-eslint/no-misused-promiseserror推奨設定でもこのルールはerrorレベルで設定されています。

ただし、このアプリではJSXの場合だけオプションのchecksVoidReturn: attributesfalseに設定しています。JSX内でコンポーネントのイベントハンドラなどに渡す関数は、Promiseを返却することが多々あります。そのため、JSX内でコンポーネントの属性に渡す関数に関しては、戻り値がvoidかをチェックしないように変更しています。
@typescript-eslint/no-namespaceerror-
@typescript-eslint/no-non-null-asserted-optional-chainerror-
@typescript-eslint/no-redeclarewarn-
@typescript-eslint/no-redundant-type-constituentserror-
@typescript-eslint/no-this-aliaserror-
@typescript-eslint/no-throw-literalwarn-
@typescript-eslint/no-unnecessary-type-assertionerror-
@typescript-eslint/no-unnecessary-type-constrainterror-
@typescript-eslint/no-unsafe-argumenterror-
@typescript-eslint/no-unsafe-assignmenterror-
@typescript-eslint/no-unsafe-callerror-
@typescript-eslint/no-unsafe-declaration-mergingerror-
@typescript-eslint/no-unsafe-enum-comparisonerror-
@typescript-eslint/no-unsafe-member-accesserror-
@typescript-eslint/no-unsafe-returnerror-
@typescript-eslint/no-unused-varserror-
@typescript-eslint/no-useless-constructorwarn-
@typescript-eslint/no-var-requireserror-
@typescript-eslint/prefer-as-consterror-
@typescript-eslint/prefer-nullish-coalescingwarn-
@typescript-eslint/prefer-optional-chainwarn-
@typescript-eslint/require-awaiterror-
@typescript-eslint/restrict-plus-operandserror-
@typescript-eslint/restrict-template-expressionserror-
@typescript-eslint/triple-slash-referenceerror-
@typescript-eslint/unbound-methoderror-

eslint

ESLintが提供するルールです。

ルールレベル推奨設定からの変更
curlyerror推奨設定ではこのルールはoffになっています。

しかし、制御構文中(if文など)の括弧を必ず明示することで、コードが統一され可読性が高まると考え、errorレベルに変更しています。
eqeqeqwarn-
no-callerwarn-
no-case-declarationswarn-
no-compare-neg-zerowarn-
no-cond-assignwarn-
no-constant-conditionwarn-
no-debuggerwarn-
no-delete-varerror-
no-duplicate-caseerror-
no-empty-character-classwarn-
no-empty-patternwarn-
no-evalwarn-
no-ex-assignwarn-
no-extend-nativewarn-
no-extra-bindwarn-
no-extra-boolean-castwarn-
no-fallthroughwarn-
no-global-assignwarn-
no-inner-declarationswarn-
no-invalid-regexperror-
no-irregular-whitespacewarn-
no-iteratorwarn-
no-label-varwarn-
no-labelswarn-
no-lone-blockswarn-
no-multi-assignwarn-
no-newwarn-
no-new-funcwarn-
no-new-objectwarn-
no-octalwarn-
no-octal-escapewarn-
no-protowarn-
no-restricted-syntaxerror推奨設定ではこのルールはoffになっています。

しかし、prototypeも取得してループするfor...in文を禁止したいため、このルールを設定しています。

なお、同様の機能を持つルールとして@typescript-eslint/no-for-in-arrayもあります。
しかし、no-restricted-syntaxはオブジェクトのfor...in文も禁止できるため、こちらのルールを設定して@typescript-eslint/no-for-in-arrayをoffにしています。
no-return-assignwarn-
no-script-urlwarn-
no-self-assignwarn-
no-self-comparewarn-
no-sequenceswarn-
no-shadow-restricted-nameswarn-
no-sparse-arrayswarn-
no-throw-literalwarn-
no-unneeded-ternarywarn-
no-unused-expressionswarn-
no-unused-labelswarn-
no-useless-computed-keywarn-
no-useless-concatwarn-
no-useless-escapewarn-
no-useless-renamewarn-
no-useless-returnwarn-
no-varerror-
no-voidwarn-
no-withwarn-
object-shorthandwarn-
prefer-consterror-
prefer-promise-reject-errorswarn-
prefer-rest-paramserror-
prefer-spreaderror-
radixwarn-
use-isnanerror-
valid-typeoferror-
yodawarn-

eslint-plugin-deprecation

非推奨コードの使用を検出するプラグインです。

ルールレベル推奨設定からの変更
deprecation/deprecationerror推奨設定ではこのルールはoffになっています。

しかし、非推奨コードの使用は自動的に検知したいためこのルールを設定しています。

eslint-plugin-eslint-comments

eslint-disableのようなディレクティブコメントの使用に関するルールを提供するプラグインです。

ルールレベル推奨設定からの変更
eslint-comments/disable-enable-pairerror-
eslint-comments/no-aggregating-enableerror-
eslint-comments/no-duplicate-disableerror-
eslint-comments/no-unlimited-disableerror-
eslint-comments/no-unused-disableerror推奨設定ではこのルールはoffになっています。

しかし、不要にESLintがチェック対象外になっていないかを検知したいため、このルールを設定しています。
eslint-comments/no-unused-enableerror-
eslint-comments/no-useerror推奨設定ではこのルールはoffになっています。

しかし、eslint-disableなどを使用してしまうとファイル単位でESLintのチェック対象外となってしまいます。そのため、eslint-disable-next-lineeslint-disable-lineのみを許可して、チェック対象外にするスコープを限定するようにしています。
eslint-comments/require-descriptionerror推奨設定ではこのルールはoffになっています。

しかし、ESLintのチェック対象外とした理由を必ず記載する運用にするため、このルールを設定しています。

eslint-plugin-import

ES moduleのimport/export構文に関するルールを提供するプラグインです。

ルールレベル推奨設定からの変更
import/exporterror-
import/firstwarn-
import/namespaceerror-
import/no-default-exporterror推奨設定ではこのルールはoffになっています。

しかし、このアプリではTypeScriptのコーディング規約でnamed exportを推奨しています。そのため、このルールを設定しています。
import/no-duplicateserror-
import/orderwarn-

eslint-plugin-jest

Jestに関するルールを提供するプラグインです。

ルールレベル推奨設定からの変更
jest/expect-expectwarn-
jest/no-alias-methodserror-
jest/no-commented-out-testswarn-
jest/no-conditional-expecterror-
jest/no-deprecated-functionserror-
jest/no-disabled-testswarn-
jest/no-done-callbackerror-
jest/no-exporterror-
jest/no-focused-testserror-
jest/no-identical-titleerror-
jest/no-interpolation-in-snapshotserror-
jest/no-jasmine-globalserror-
jest/no-mocks-importerror-
jest/no-standalone-expecterror-
jest/no-test-prefixeserror-
jest/unbound-methoderror推奨設定ではこのルールはoffになっています。

しかし、同様の機能を持つ@typescript-eslint/unbound-methodをerrorレベルで設定しています。それをJest用に拡張したこのルールも設定すべきと考え、このルールを設定しています。

なお、対象がテストファイル(*.test.ts*.test.tsx)の場合は@typescript-eslint/unbound-methodをoffにして、このルールのみ適用するようにしています。
jest/valid-describe-callbackerror-
jest/valid-expecterror-
jest/valid-expect-in-promiseerror-
jest/valid-titleerror-

eslint-plugin-node

Node.jsに関するルールを提供するプラグインです。

ルールレベル推奨設定からの変更
node/handle-callback-errwarn-
node/no-new-requirewarn-

eslint-plugin-prettier

ESLintでPrettierを実行し、Prettierのルールに違反する箇所をESLintの警告やエラーとして検出するプラグインです。

ルールレベル推奨設定からの変更
prettier/prettierwarn-

eslint-plugin-react

Reactに関するルールを提供するプラグインです。

ルールレベル推奨設定からの変更
react/jsx-boolean-valuewarn-
react/jsx-curly-brace-presencewarn-
react/jsx-fragmentswarn-
react/jsx-no-bindwarn-
react/jsx-no-duplicate-propserror-
react/jsx-no-undeferror-
react/jsx-uses-reactwarn-
react/jsx-uses-varswarn-
react/no-access-state-in-setstatewarn-
react/no-did-mount-set-statewarn-
react/no-did-update-set-statewarn-
react/no-direct-mutation-statewarn-
react/no-redundant-should-component-updatewarn-
react/no-this-in-sfcwarn-
react/no-unknown-propertywarn-
react/no-will-update-set-statewarn-
react/require-render-returnwarn-
react/self-closing-compwarn-

eslint-plugin-react-hooks

React Hooksに関するルールを提供するプラグインです。

ルールレベル推奨設定からの変更
react-hooks/exhaustive-depswarn-
react-hooks/rules-of-hookserror-

eslint-plugin-strict-dependencies

Moduleの依存性に関するルールを提供するプラグインです。

ルールレベル推奨設定からの変更
strict-dependencies/strict-dependencieserror推奨設定ではこのルールはoffになっています。

このアプリでは、機能レイヤーの依存関係に準拠した設定をしています。