ぶちのブログ

競プロとCTFが趣味なWebエンジニアのアウトプットの場

【TypeScript】interfaceを禁止してtypeを使うeslintのカスタムルールを作ってみた

はじめに

typeとinterfaceの使い分けで、一部の例外を除いて、できるだけtypeを使うべきというコーディングスタイルを定めてみました。
eslint-typescriptにはprefer-function-typeというルールはあるけれど、その逆はないので、カスタムルールを作ってみました。

TL;DR

'no-restricted-syntax': [
  2,
  {
    selector: 'TSInterfaceDeclaration',
    message: 'Prefer types to interfaces.'
  }
]

typeとinterfaceの使い分けについて

古めの記事だと、interfaceを優先するような記述が見られるが、最近ではそうでもなさそうです!
(昔はtypeでできることが少なかったけれど、最近はtypeの機能が増えたという歴史的経緯が関係していそう)

調べたところ、interfaceはあくまでもclassの型を定義するもの、typeはobjectの型を定義するもののようです。
classの使用頻度にもよりますが、ライブラリを開発しているのでなければ、多くの場所でtypeを使うというコーディングスタイルも考えられるのではないでしょうか。

しかし、eslint-typescriptには、prefer-function-typeというルールはありますが、その逆は現状ありません。

eslintのカスタムルールを作ってみる

no-restricted-syntaxを使うことで、interfaceを禁止するルールを作ってみます。
interfaceの宣言に相当するselectorがわかればカスタムルールを設定できそうなので、typescript-eslint/parserを調べに行きます。
こちらのファイルにTSInterfaceDeclarationというそれっぽい名前があるので、それを使い、

'no-restricted-syntax': [
  2,
  {
    selector: 'TSInterfaceDeclaration',
    message: 'Prefer types to interfaces.'
  }
]

上記のようにeslintの設定に書き加えると、想定通りの動きをしてくれました!

参考記事

https://github.com/typescript-eslint/typescript-eslint/issues/433 https://jp.quora.com/TypeScript%E4%BD%BF%E3%81%84%E3%81%AB%E8%B3%AA%E5%95%8F%E3%81%A7%E3%81%99-Interface%E3%81%A8Type%E3%81%AE%E4%BD%BF%E3%81%84%E5%88%86%E3%81%91%E3%81%AF%E3%81%A9%E3%81%86%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99