1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【TypeScript】map 実行前に filter(Boolean) を入れる理由と注意点

Posted at

はじめに

こんにちは。アメリカ在住で独学エンジニアを目指している Taira です。

JavaScript や TypeScript で配列の要素を変換する際に .map() を使うことはよくあります。しかし、配列内に nullundefined が混ざっていると、map() の中でプロパティにアクセスした瞬間に実行時エラーが発生します。

今回は、filter(Boolean) を挟むことでなぜそれを回避できるのか、そして注意すべき点について解説します。


配列の中に null がある場合

type Teacher = { id: number; name: string };
const teachersData: (Teacher | null)[] = [
  { id: 1, name: '山田' },
  null,
  { id: 2, name: '田中' },
];

const toTeacherRow = (teacher: Teacher) => ({
  id: teacher.id, // null の場合ここでエラー
  name: teacher.name,
});

teachersData.map(toTeacherRow); // ❌ 実行時エラー

このコードは null.id にアクセスするため、次のようなエラーが出ます。

Uncaught TypeError: Cannot read properties of null (reading 'id')

React で実装している際に、たとえ null の値を意図的に入れていなかった場合でも API によるデータ取得が間に合わなくて null になる場合もあります。


3. filter(Boolean) で解決する

const teacherRows = teachersData
  .filter(Boolean) // falsy な値を除外
  .map(toTeacherRow);

console.log(teacherRows);
// [
//   { id: 1, name: '山田' },
//   { id: 2, name: '田中' }
// ]

.filter(Boolean)falsy な値(nullundefined0'' など)を除外します。
これにより、map() の対象から nullundefined が消え、実行時エラーを防げます。


4. filter(Boolean) の注意点

filter(Boolean) は便利ですが、0 や空文字も除外してしまう ことに注意しましょう。

[0, 1, 2].filter(Boolean); // [1, 2]
['', 'a', 'b'].filter(Boolean); // ['a', 'b']

もし「nullundefined だけを除外したい」なら、型ガードを使うのが安全です。

teachersData
  .filter((t): t is Teacher => t != null) // null と undefined だけを除外
  .map(toTeacherRow);

5. まとめ

  • 配列が nullundefined を含む可能性があるなら、map() の前に除外処理を入れるべき
  • filter(Boolean) は短く書けるが、0 や空文字も除外するので用途によっては型ガードの方が安全
  • 「配列全体が null じゃなくても、中の要素が null になるケースがある」 ことを意識すると、非同期処理や外部データ取り込みでのエラーを防げる
1
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?