📏

typescript-eslintにconsistent-returnが追加されました

2024/03/05に公開

先日リリースされたv7.1.0typescript-eslintに新しいルールとしてconsistent-returnが追加されました。

https://typescript-eslint.io/rules/consistent-return

同名のルールはESLint本体に以前から存在していて、その強化版になります。具体的にはvoidをよりうまく扱えるようになったようです。

利用にはtype checkが必要になります。このルールに限らずtypescript-eslintを使うなら型情報を活用しない手はないと思うので、有効にして各種ルールを適用するのがおすすめです。

https://typescript-eslint.io/getting-started/typed-linting/

このルールは関数の戻り値の型が一貫しているかを確認してくれて、

function wrapText(value:string) {
  if (value === '') {
    return;
  }
  return `[${value}]`;
}

みたいなコードを書くと警告してくれます。

こうしたミスに対してはexplicit-function-return-typeを有効にして、常に戻り値の型を書くのもひとつのアプローチですが、なるべく型推論に任せつつ不整合チェックでミスを防ぎやすいconsistent-returnは有用なツールだと思います。

recommemdedには入っていないので知名度はあまり高くないかもしれませんが、なかなか面白いルールなのでお試しあれ。

ちょっとした注意点としては、こういうコードを書くと

type Status = 'foo' | 'bar';

export function getStatusCode(status: Status) {
  switch (status) {
    case 'foo':
      return 1;
    case 'bar':
      return 2;
  }
}

caseにマッチしなかった場合にnumberが返らないので警告されます。

型で規定していてもruntimeで何が起こるかは分からないので、想定外の値が来た場合の処理は書いておいた方が安心です。

この対策としてswitchの後にreturn 0とかすると、その部分がtscにunreachable codeとして怒られたりします(設定がゆるいと警告されない場合もある)。

これを落ち着かせるにはdefault節を追加して、そこでnumberを返すように書く必要があります。

export function getStatusCode(status: Status) {
  switch (status) {
    case 'foo':
      return 1;
    case 'bar':
      return 2;
    default:
      return 0;
  }
}

あるいはdefault節では0を返すのではなく、エラーを投げたいかもしれません。いずれにせよ何らかの処置を取らないとLintが通らなくなります。この挙動そのものは妥当だと考えますが、一応そういうのもあるよってことで。

Discussion