Typescript で ESLint ルールを作るときに@typescript-eslint/experimental-utils を使うと便利

tyankatsu0105/eslint-plugin
を TS で作っているという話を以前の記事で紹介した。
ESLint のルールを TypeScript で実装してみる
実は typescript-eslint チームは、TS で ESLint rule を作る utility を公開している。それが@typescript-eslint/experimental-utils

自分が作っているルールもこれらからESLintUtils.RuleCreatorTSESLint.RuleTesterを使っている。

ESLintUtils.RuleCreator

こういうふうにして使っている。
ルール名を引数とするコールバック関数を返して、それを createRule 関数とする。
ルールを作る際には、この createRule 関数を export して作る。
generics でルールのoptionsmessageIdsの型を指定できる。
ルールを作る際には meta と create を export するのだが、これらに型が当てられていて作りやすくなっている。

ちなみに、typescript-eslint チームは、ここで独自の型を定義している。 @types/eslintは一切考慮してなさそう。

ここで name を指定すると、createRule 関数を作るときに返した string が meta.docs.url に入るようになるので便利。

TSESLint.RuleTester

ESLint 純正の RuleTesterに型を当てたもの。
拡張したい場合は、class なので extends できる。
自分は parser の種類を string literal types で列挙したかったのと、parser を absolute path にしないとだめなので、拡張して使ってる。

typescript-eslint チームが使ってる RuleTester が ESLintUtils として export されたみたい。これ使ってもいいかもしれない。

終わりに

utility なので、まだ改善の余地があると思う。
こういうのほしいって思ったら issue 投げてみるの良さそう。

余談

npm run updateファイルを自動生成するようにしてある。
これに直接触られておかしなことになるという自体を防ぎたかったのでActions の workflow を作った。
git diff して差分あったら PR にコメントを出して、exit code 1 でテストを失敗させるというもの。
意外に便利。