カテゴリ: TypeScript 更新日: 2026/05/07

TypeScriptでNonNullableを使ってnullやundefinedを完全に除去する方法

TypeScriptで`NonNullable<T>`を使ってnull/undefinedを除去する方法
TypeScriptで`NonNullable<T>`を使ってnull/undefinedを除去する方法

先生と生徒の会話形式で理解しよう

生徒

TypeScriptを使っていると、データが空っぽの状態を示すnullやundefinedが混ざってきてエラーになることがあって困っています。これらを綺麗に取り除く方法はありますか?

先生

それはプログラム開発でよくある悩みですね。TypeScriptには、NonNullableという便利な道具があらかじめ用意されています。これを使えば、型の中から不要な空の状態を簡単に取り除くことができますよ。

生徒

NonNullableを使えば、もっと安全にコードが書けるようになるんですね!具体的にどうやって使うのか教えてください!

先生

もちろんです。パソコンを触ったことがない方でもイメージしやすいように、基本的な仕組みから順番に解説していきますね!

1. TypeScriptのNonNullableとは何かを学ぼう

1. TypeScriptのNonNullableとは何かを学ぼう
1. TypeScriptのNonNullableとは何かを学ぼう

TypeScriptの世界には、NonNullableという便利な機能があります。これは、日本語に直訳すると「空っぽ(nullやundefined)にできない」という意味になります。プログラミングをしていると、箱の中に値が入っていることもあれば、何も入っていない空の状態になることもあります。この空の状態を許してしまうと、後で計算をしたり文字を表示したりするときに、中身がないためにコンピューターが混乱してエラーを起こしてしまいます。NonNullableは、あらかじめ「この箱には絶対に空の状態を入れないでください」というルールを型に対して適用するための仕組みです。これにより、プログラムの安全性がぐっと高まります。

そもそもとは、データの種類を決めるラベルのようなものです。例えば「これは数値です」「これは文字です」といったラベルを貼ることで、間違った使い方ができないように見張ってくれるのがTypeScriptの役割です。NonNullableを使うことで、そのラベルから「空っぽ」という選択肢を削除することができるのです。

2. nullとundefinedという特殊な状態について

2. nullとundefinedという特殊な状態について
2. nullとundefinedという特殊な状態について

プログラミング未経験の方にとって、nullundefinedという言葉は聞き慣れないかもしれません。まずはこの二つの違いを簡単に整理しておきましょう。nullは、意識的に「今は何も入っていません」ということを示す値です。空の財布をイメージすると分かりやすいかもしれません。財布という実体はあるけれど、中身のお金はゼロ、という状態です。一方で、undefinedは「まだ何も定義されていない」「値が割り当てられていない」という、より未確定な状態を指します。そもそも財布を持っているかどうかも分からない、といったイメージです。

TypeScriptでは、これら二つをまとめてNullable(ヌラブル)な状態、つまり「空である可能性がある状態」と呼びます。多くのバグはこの空の状態をうっかり触ってしまうことで発生します。そこで、NonNullableというユーティリティ型を使って、これらの厄介な値を型から追放する方法を身につける必要があります。

3. NonNullableの基本的な書き方を確認しよう

3. NonNullableの基本的な書き方を確認しよう
3. NonNullableの基本的な書き方を確認しよう

NonNullableの使い方はとてもシンプルです。基本的には、対象となる型をカッコの中に書き込むだけです。例えば、文字が入るかもしれないし、空(nullやundefined)かもしれないという型があったとします。その型にNonNullableを適用すると、文字だけの型に生まれ変わります。実際のコードでどのように記述するのか、以下の例を見てみましょう。


// 文字列、null、undefinedのいずれかが入る可能性がある型
type MaybeString = string | null | undefined;

// NonNullableを使って、nullとundefinedを削除する
type PureString = NonNullable<MaybeString>;

// PureString型には、文字列しか入れられなくなります
let myText: PureString = "こんにちは!";
// myText = null; // ここでエラーになります

このコードでは、最初にMaybeStringという「何でもあり」な型を作っています。その後、NonNullableという魔法をかけることで、PureStringという「純粋な文字列だけ」の型を作り出しています。このように、既存の型から不要な要素を削ぎ落として新しい型を作るのが、TypeScriptの便利な機能の一つです。

4. なぜ空の状態を除去する必要があるのか

4. なぜ空の状態を除去する必要があるのか
4. なぜ空の状態を除去する必要があるのか

なぜわざわざ手間をかけてnullやundefinedを取り除くのでしょうか。その理由は、プログラムを安定して動かすためです。例えば、ユーザーが入力した名前を表示する処理を考えてみましょう。もし名前が空(null)の状態で、その文字数を数えようとすると、コンピューターは「空っぽのものの長さをどうやって測ればいいの?」とパニックになり、プログラムが停止してしまいます。これをランタイムエラーと呼び、ウェブサイトが表示されなくなったり、アプリが落ちたりする原因になります。

TypeScriptの優れた点は、実際にプログラムを動かす前に、コードを書いている最中に「ここは空っぽになる可能性がありますよ、危ないですよ!」と教えてくれることです。NonNullableを使って「ここは絶対空にならない型です」と宣言しておくことで、無理に空のデータを扱おうとするミスを未然に防ぐことができるのです。これは、工事現場でヘルメットを被るのと同じくらい、プログラミングにおいて大切な安全対策です。

5. Mapped Typesとの組み合わせで高度な操作を行う

5. Mapped Typesとの組み合わせで高度な操作を行う
5. Mapped Typesとの組み合わせで高度な操作を行う

さらに一歩進んだ使い方として、Mapped Types(マップドタイプス)という機能と組み合わせることもあります。これは、複数のデータが集まったオブジェクト全体の型を、一気に変換する技術です。例えば、会員登録のフォームで、最初は全ての項目が未入力(nullを許容)だったとしても、登録完了後には全ての項目が埋まっている状態にしたい場合に役立ちます。

以下の例では、複数の項目を持つ型から一気にnullを除去するようなイメージをコードで表現しています。初心者の方には少し難しく見えるかもしれませんが、「型をまとめて変換できる便利な機能があるんだな」くらいに思っておいてください。


// すべてのプロパティがnullを許可している型
interface UserProfile {
    name: string | null;
    email: string | null;
    age: number | null;
}

// 独自の変換ルールを作って、一気にNonNullableを適用する(簡易例)
type RequiredProfile = {
    [P in keyof UserProfile]: NonNullable<UserProfile[P]>;
};

const user: RequiredProfile = {
    name: "山田太郎",
    email: "yamada@example.com",
    age: 25
};

このように、一つ一つの型に手動でNonNullableを適用するのではなく、一括で変換することで、修正漏れを防ぎ、効率的に開発を進めることができます。これがTypeScriptの持つ強力な表現力です。

6. 条件分岐と組み合わせて安全に値を取り出す

6. 条件分岐と組み合わせて安全に値を取り出す
6. 条件分岐と組み合わせて安全に値を取り出す

型の上でnullを除去するだけでなく、実際のプログラムの動き(ロジック)の中で、安全に値を確認する方法も知っておきましょう。これを型ガードと呼びます。NonNullableで定義した型に値を代入する前に、if文を使って「もし値が空でなければ」という確認を挟むのが一般的です。これにより、TypeScriptは「このif文の中では、値は確実に存在する」と認識してくれるようになります。


function printMessage(msg: string | null) {
    // もしmsgがnullでないなら
    if (msg !== null) {
        // この中ではmsgは確実にstring型として扱える
        const content: NonNullable<string | null> = msg;
        console.log("メッセージの内容: " + content);
    } else {
        console.log("メッセージはありません。");
    }
}

printMessage("Hello!");
printMessage(null);

メッセージの内容: Hello!
メッセージはありません。

このコードの実行結果を見ると、渡された値に応じて処理が正しく切り替わっているのが分かります。NonNullableを使う場面と、if文によるチェックを組み合わせることで、鉄壁の守りを持つプログラムを構築することができるのです。パソコンの操作に慣れていない方でも、この「もし〜なら」という考え方は日常生活と同じなので、イメージしやすいのではないでしょうか。

7. ユニオン型でのNonNullableの振る舞い

7. ユニオン型でのNonNullableの振る舞い
7. ユニオン型でのNonNullableの振る舞い

TypeScriptには、複数の型を縦棒(|)で繋いで「AまたはB」という表現をするユニオン型というものがあります。NonNullableはこのユニオン型に対して非常に強力に作用します。例えば、「文字列、数値、あるいはnull」という型から、一瞬でnullだけを消し去り、「文字列または数値」という型に変更できます。これは、複雑なデータを扱うアプリケーション開発において、特定の状態だけをフィルタリングしたい時にとても役立ちます。


// いろいろな種類が混ざった型
type DiverseData = string | number | boolean | null | undefined;

// NonNullableで空の要素だけを一掃する
type EssentialData = NonNullable<DiverseData>;

// EssentialDataは string | number | boolean と同じ意味になる
let data1: EssentialData = "テスト";
let data2: EssentialData = 100;
let data3: EssentialData = true;
// data1 = undefined; // エラーが発生します

このように、複数の可能性の中から不要なものだけを取り除く作業は、まるで砂の中から宝石だけを選り分ける作業に似ています。NonNullableというフィルターを通すことで、常に純度の高い、信頼できるデータだけをプログラムの中で使い続けることができるようになります。これが、大規模な開発でもエラーを少なく保つための秘訣です。

8. 初心者が注意すべきポイントと解決策

8. 初心者が注意すべきポイントと解決策
8. 初心者が注意すべきポイントと解決策

NonNullableを使い始めると、いくつか注意すべき点が出てきます。その一つは、NonNullableはあくまで「型」の定義を助けるものであり、実際の変数の値を魔法のように書き換えるものではないということです。型をNonNullableに定義したからといって、既にnullが入っているデータを無理やり流し込めるわけではありません。必ず、代入する前にデータが本当に存在するかを確認する必要があります。

また、パソコンのキーボード操作や英語の単語に慣れていないうちは、スペルミスにも注意しましょう。NonNullableNullableの部分にはLが二つ重なっています。こうした細かいルールに最初は戸惑うかもしれませんが、TypeScriptをサポートしているエディタ(VS Codeなど)を使えば、自動で候補を出してくれるので安心してください。一歩ずつ、まずは基本的な型からnullを除去する練習を繰り返すことで、自然とTypeScriptの恩恵を受けられるようになっていきます。プログラミングは、こうした小さな「安全の積み重ね」が大きな成果に繋がる面白い世界です。

カテゴリの一覧へ
新着記事
New1
TypeScript
TypeScriptの関数に型をつける方法(引数・戻り値)を初心者向けに徹底解説!
New2
TypeScript
TypeScriptの始め方:開発環境の構築手順【初心者向け】
New3
TypeScript
TypeScriptでExpressのミドルウェアを型安全に定義する方法!バックエンド開発の初心者向け解説
New4
JavaScript
JavaScriptのfilterメソッドで条件に合う要素を抽出する方法
人気記事
No.1
Java&Spring記事人気No1
JavaScript
JavaScriptでフォームの値を取得する方法を徹底解説!valueプロパティの使い道
No.2
Java&Spring記事人気No2
JavaScript
JavaScriptでHTML5バリデーションAPIを使いこなす!初心者でもわかるフォーム入力チェック
No.3
Java&Spring記事人気No3
TypeScript
TypeScript学習におすすめの無料教材・リファレンスサイト【初心者向け】
No.4
Java&Spring記事人気No4
TypeScript
TypeScriptでコメントを書く正しい書き方と使い分け【初心者向けにやさしく解説】
No.5
Java&Spring記事人気No5
JavaScript
JavaScriptで要素を削除する方法(removeChild, removeなど)
No.6
Java&Spring記事人気No6
JavaScript
JavaScriptのインストール方法まとめ!Windows・Mac・Linux別にステップ解説
No.7
Java&Spring記事人気No7
JavaScript
JavaScriptの配列操作でよくあるエラーとその解決法まとめ
No.8
Java&Spring記事人気No8
JavaScript
JavaScriptの現在日時を取得する方法を完全ガイド!初心者でもわかるDate.now()とnew Date()