こんにちは!

TypeScriptでプログラミングをしていると、nullundefined、そして空文字('')といった「値がない」状態によく出会います。これらを正しく判定する方法は、バグを防ぎ、安定したアプリケーションを開発するために非常に重要です。

nullundefinedって、結局何が違うの?
===== の使い分けがよく分からない…。
空文字だけを判定するスマートな方法はないかな?

TypeScriptでの値の判定について、このような疑問をお持ちではないでしょうか。

この記事では、TypeScriptにおけるnullundefined、空文字の判定方法について、それぞれの値が持つ意味から、具体的な判定方法、そして注意点までを詳しく解説します。

この記事は次のような方におすすめです。

この記事はこんな人におすすめ!
  • TypeScriptでnullundefinedの扱いに悩んでいる方
  • 値の判定処理を正しく安全に書きたい方
  • =====の違いを明確に理解したい方
  • TypeScriptの基礎を固めたい初学者の方
  • コードの品質を向上させたいと考えている開発者の方

この記事を読めば、nullundefined、空文字の違いと、それぞれの状況に応じた最適な判定方法が分かります。TypeScriptにおける値の扱い方をマスターして、より堅牢で読みやすいコードを書けるようになりましょう。

「値がない状態を正しく判定したい方」「TypeScriptのコードに自信を持ちたい方」は、ぜひ参考にしてください。

それでは、順を追って詳しく見ていきましょう!

null、undefined、空文字の違い

まずはじめに、これら3つの値がそれぞれどのような意味を持つのかを理解することが大切です。これらはすべて「何もない」状態を表しているように見えますが、その背景には明確な違いがあります

説明
null null 開発者が意図的に「値が存在しない」ことを示した場合に使う値です。
undefined undefined 値がまだ代入されていない、または存在しないプロパティにアクセスした場合のデフォルト値です。
空文字 ('') string 文字列型ですが、その長さが0である状態を示します。

null「無いことが意図された状態」であり、undefined「まだ何も無い状態」と考えると分かりやすいかもしれません。そして空文字は、あくまで文字数が0の「文字列」です。この違いを意識することが、正しい判定への第一歩となります。

nullの判定方法

nullを判定する最も安全で推奨される方法は、厳密等価演算子 === を使うことです。

const value: string | null = null;

if (value === null) {
  console.log("この値はnullです。");
} else {
  console.log("この値はnullではありません。");
}
// 出力: この値はnullです。

この方法は、valuenullであることだけを正確に判定します。undefinedや他のfalsyな値(0false、空文字など)と混同することがないため、非常に信頼性が高いです。

undefinedの判定方法

undefinedの判定も、nullと同様に厳密等価演算子 === を使うのが基本です。

let value: string | undefined; // 初期値が代入されていないためundefined

if (value === undefined) {
  console.log("この値はundefinedです。");
} else {
  console.log("この値はundefinedではありません。");
}
// 出力: この値はundefinedです。

また、typeof演算子を使って型そのものをチェックする方法もあります。

let value: string | undefined;

if (typeof value === "undefined") {
  console.log("この値はundefinedです。");
}
// 出力: この値はundefinedです。

typeofを使う方法は、変数が宣言されていない場合でもエラーにならずに判定できるという特徴がありますが、通常は===を使った判定で十分な場合がほとんどです。

nullとundefinedをまとめて判定する方法

nullundefinedの両方を「値がない」状態としてまとめて扱いたいケースはよくあります。その場合、等価演算子 == を使うと便利です。

let value: string | null | undefined = null;

// nullの場合
if (value == null) {
  console.log("この値はnullまたはundefinedです。");
}
// 出力: この値はnullまたはundefinedです。

value = undefined;

// undefinedの場合
if (value == null) {
  console.log("この値はnullまたはundefinedです。");
}
// 出力: この値はnullまたはundefinedです。

value = "";

// 空文字の場合はfalseになる
if (value == null) {
  console.log('このブロックは実行されない');
}

== null という書き方は、nullundefinedの両方をtrueと判定する特別な挙動をします。これはTypeScript(JavaScript)の仕様によるもので、他のfalsyな値(0false''など)はfalseと判定されるため、nullundefinedだけを区別せずに扱いたい場合に非常に有効です。

== と === の使い分け

ここで、==(等価演算子)と ===(厳密等価演算子)の違いを整理しておきましょう。

===(厳密等価演算子)
  • 型の変換を行わずに、値と型の両方が等しいかを比較します。
  • null === undefinedfalse になります。
  • 意図しない型の変換を防げるため、基本的にはこちらを使うことが推奨されます。
==(等価演算子)
  • 比較する際に、必要に応じて暗黙的な型の変換を行います。
  • null == undefinedtrue になります。
  • 上記で説明した == null のような意図した使い方を除き、予期せぬ動作の原因になることがあるため、使用には注意が必要です。

空文字(”)の判定方法

空文字かどうかを判定するには、値が空文字そのものであるかを === で比較する方法が最もシンプルです。

const text: string = '';

if (text === '') {
  console.log('この文字列は空文字です。');
} else {
  console.log('この文字列は空文字ではありません。');
}
// 出力: この文字列は空文字です。

また、文字列の長さをチェックする方法もよく使われます。

const text: string = "";

if (text.length === 0) {
  console.log("この文字列は空文字です。");
} else {
  console.log('この文字列は空文字ではありません。');
}
// 出力: この文字列は空文字です。

この方法は、コードの意図が「長さが0の文字列かどうか」を判定していることが明確になるため、可読性が高いと言えます。

null、undefined、空文字をまとめて判定する方法

では、これら3つすべてを「有効な値ではない」として一度に判定したい場合はどうすればよいでしょうか。

単純に if 文の条件式に値を入れると、TypeScriptは「truthy」か「falsy」かで値を評価します。

truthyな値
falsy以外のすべての値(空でない文字列、0以外の数値、オブジェクト、配列など)
falsyな値
false, 0, '' (空文字), null, undefined, NaN

この性質を利用すると、次のように書くことができます。

function processValue(value: string | null | undefined) {
  if (value) {
    console.log(`有効な値です: ${value}`);
  } else {
    console.log("値はnull、undefined、または空文字です。");
  }
}

processValue("こんにちは"); // 出力: 有効な値です: こんにちは
processValue("");          // 出力: 値はnull、undefined、または空文字です。
processValue(null);        // 出力: 値はnull、undefined、または空文字です。
processValue(undefined);   // 出力: 値はnull、undefined、または空文字です。

if (value) という条件式は、valueがtruthyな場合にのみブロック内を実行します。nullundefined、空文字はいずれもfalsyな値なので、この書き方でまとめて判定できます。

ただし、この方法は数値の 0 や真偽値の false もfalsyとして扱ってしまう点に注意が必要です。もし 0false を有効な値として扱いたい場合は、この方法は適していません。

より厳密に3つだけを判定する場合

0false を除外し、nullundefined、空文字の3つだけを判定したい場合は、それぞれの条件を明示的に組み合わせる必要があります。

function processValue(value: string | number | boolean | null | undefined) {
  if (value === null || value === undefined || value === "") {
    console.log("値はnull、undefined、または空文字です。");
  } else {
    console.log(`有効な値です: ${value}`);
  }
}

processValue("こんにちは"); // 出力: 有効な値です: こんにちは
processValue(0);           // 出力: 有効な値です: 0
processValue(false);       // 出力: 有効な値です: false
processValue("");          // 出力: 値はnull、undefined、または空文字です。
processValue(null);        // 出力: 値はnull、undefined、または空文字です。
processValue(undefined);   // 出力: 値はnull、undefined、または空文字です。

この方法は冗長に見えるかもしれませんが、判定の意図が明確になり、最も安全なコードと言えます。

【付録】さらに学びを深めるためのリソース


さらにTypescriptの学習を進めたい方のために、いくつかのリソースを紹介します。
これらのリソースを活用することで、TypeScriptの型システムについてより深い知識を得ることができるでしょう。

おすすめの書籍


ゼロからわかる TypeScript入門



技術評論社から出版されている「ゼロからわかる TypeScript入門」は、プログラミング初心者や本職プログラマーではない方を主な対象にした入門書です。

変数・条件分岐・ループといった基本から、クラスやインターフェース、モジュールまで段階的に学べる構成になっています。最終章ではWeb APIとJSONを使った非同期Webアプリの作成も体験できるので、「実際に動くものを作る」ところまで到達できます。

プロを目指す人のためのTypeScript入門



技術評論社の「プロを目指す人のためのTypeScript入門 安全なコードの書き方から高度な型の使い方まで」、通称 ブルーベリー本 です。

JavaScriptの仕様とTypeScript独自の機能を両方押さえつつ、リテラル型・ユニオン型・keyof型・ジェネリクスなど、高度な型表現まで踏み込んで解説しています。TypeScriptの型システムの表現力を本格的に学べる一冊です。




オンラインで参照できる公式ドキュメント


TypeScript公式ハンドブック


https://www.typescriptlang.org/docs/
TypeScriptの公式ドキュメントです。
intersection型を含む、すべての型システムの機能について詳細な説明があります。

TypeScript Deep Dive


https://basarat.gitbook.io/typescript/
TypeScriptの深い部分まで掘り下げて解説しているオンラインブックです。
無料で読むことができ、intersection型についても詳しく説明されています。

TypeScriptの学習は終わりがありません。
新しい機能が常に追加され、より良い書き方が発見されています。
継続的に学習を続けることで、より良いTypeScriptプログラマーになれるはずです。

キャリア形成/給与還元
ひとつひとつ真摯に向き合う企業
ONE_WEDGE社員募集

株式会社 ONE WEDGEでは、新たな仲間を募集しています!

私たちと一緒に、革新的で充実したキャリアを築きませんか?
当社は、従業員が仕事と私生活のバランスを大切にできるよう、充実した福利厚生を整えています。

  • 完全週休2日制(土日休み)で、祝日や夏季休暇、年末年始休暇もしっかり保証!
  • 様々な休暇制度(有給、慶弔、産前・産後、育児、バースデー休暇、有給6日取得で特別休暇付与)を完備!
  • 従業員の成長と健康を支援するための表彰制度、資格取得支援、健康促進手当など!
  • 生活を支えるテレワーク手当、記事寄稿手当、結婚祝金・出産祝金など、様々な手当を提供!
  • 自己啓発としての書籍購入制度や、メンバー間のコミュニケーションを深める交流費補助!
  • 成果に応じた決算賞与や、リファラル採用手当、AI手当など、頑張りをしっかり評価!
  • ワークライフバランスを重視し、副業もOK!

株式会社 ONE WEDGEでは、一人ひとりの従業員が自己実現できる環境を大切にしています。
共に成長し、刺激を与え合える仲間をお待ちしております。
あなたの能力と熱意を、ぜひ当社で発揮してください。
ご応募お待ちしております!

ホームページ、採用情報は下記ボタンからご確認ください!

応募、ご質問など、お問い合わせフォーム、またはX (旧Twitter)、InstagramのDMでお気軽にご相談ください♪

まとめ

TypeScriptにおけるnullundefined、空文字の判定は、それぞれの値の性質を理解し、状況に応じて適切な演算子を使い分けることが重要です。

  • nullだけを判定する場合は value === null を使います。
  • undefinedだけを判定する場合は value === undefined を使います。
  • nullundefinedの両方を判定したい場合は value == null が便利です。
  • 空文字を判定する場合は value === "" または value.length === 0 を使います。
  • nullundefined、空文字をまとめてfalsyとして判定する場合は if (value) が使えます。
  • 0falseを含めずに厳密に判定する場合は、|| で条件を組み合わせます。

これらの判定方法を正しく使いこなすことで、予期せぬバグを減らし、コードの信頼性を高めることができます。特に、安全性を重視するなら、型の変換を行わない厳密等価演算子 === を基本として使うことを心がけましょう。

※本記事の本文案はAIを活用して作成していますが、記載しているコードは筆者が実際に実行・検証し、内容の正確性を確認したうえで公開しています。