🐈

[typescript]filterのcallback関数内のreturnを忘れる

2025/03/16に公開

本題

こんな感じで、returnを忘れた時もfilterは空のarrayを返すので、returnを忘れたことが分かりづらいです。

const a = ['b'];
const b = a.filter((e)=>{
    true
});

console.log(b) // []

なので、こんな感じで、戻り値の型を指定するとTypeScriptではエラーが発生するのでわかりやすくなります

const a = ['b'];
const b = a.filter((e: string): boolean => {
  true;
});
console.log(b)

↓Playgroundでエラーの出ている様子
エラーの出ている様子

ただ、片っ端から、booleanを指定していくわけにもいかないと思うんですよね。

↓のようにそもそも{}がないコードにbooleanを付けると冗長です。

const b = ['b'].filter((e): boolean => 
  true
);

でも、自分がreturnをつけ忘れたところは、最初アロー関数で書いてたところを、2行以上コードを書くことになったので、{}をつけて、やっぱり1行に戻そうとなったところです。

このケースの時は、そもそもアロー関数の場合でも、booleanをつけておけば防げたわけですが、慣れてる人にとっては逆に可読性が落ちそうですね。。。

CursorでClaude 3.5 Sonnetに聞いてみた

的確に問題点を指摘してくれます。これでもいいような気がします。

結論

はちょっと出なかったですが、とりあえず、まずは何でもCursorに聞いてみようという癖はつけようかなと思いました。

おまけ

さらに冗長に型を指定する

const a = ['b'];
const callbackFn: (e: string) => boolean = (e)=>{
  true;
};
const b = a.filter(callbackFn);

console.log(b)

↓Playgroundでエラーの出ている様子

dartと比べてみた

typescriptとdartをよく比べることがあるんですが、dartだと↓のような感じで警告が出ます。

ドキュメントを見る感じだと、コールバックの関数の戻り値がちゃんとboolと決まってるからみたいですね。↓
https://api.flutter.dev/flutter/dart-core/Iterable/where.html

TypeScriptは↓だと思われます。
https://github.com/microsoft/TypeScript/blob/1efdcd9ff7d6566cf9bf10975b6fc8ffb0b53c9b/src/lib/es5.d.ts#L1266
コールバック関数の戻り値がunknownで規定されてるんですね。

しくみのテックブログ

Discussion