typescript-eslintにconsistent-returnが追加されました
先日リリースされたv7.1.0でtypescript-eslint
に新しいルールとしてconsistent-return
が追加されました。
同名のルールはESLint本体に以前から存在していて、その強化版になります。具体的にはvoidをよりうまく扱えるようになったようです。
利用にはtype checkが必要になります。このルールに限らずtypescript-eslintを使うなら型情報を活用しない手はないと思うので、有効にして各種ルールを適用するのがおすすめです。
このルールは関数の戻り値の型が一貫しているかを確認してくれて、
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