【入門編】 Partialによる全プロパティの任意化 – TypeScript実践ガイド

こんにちは!TypeScriptの世界へようこそ。チーフアーキテクトの私です。

新しい技術を学び始めた頃って、「なんだかルールが厳しそう」「エラーが赤く光って怖い……」と感じてしまいますよね。特にTypeScriptは、型というガードレールがしっかりしすぎていて、時には「ちょっとだけここを書き換えたいだけなのに!」と息が詰まることもあるでしょう。

大丈夫ですよ、安心してください。今日一緒に見ていく `Partial`(パーシャル) という機能は、そんな私たちの「めんどくさい!」を優しく解決してくれる、すごく頼もしいお助けアイテムなんです。

それでは、身近な例えからゆっくり紐解いていきましょうか。

—

1. ユーザープロフィールの更新で、こんなモヤモヤを感じたことはありませんか?

Webアプリケーションを作っていると、よくあるのが「ユーザーのプロフィール編集画面」です。
例えば、次のような「ユーザーのデータ型」を定義したとします。

// ユーザーの基本情報(全部必須!)
interface User {
id: number;
name: string;
email: string;
age: number;
}

「IDも、名前も、メールアドレスも、年齢も、絶対にないと困る!」という新規登録の画面であれば、この `User` 型は完璧です。誰も文句は言いません。

しかし、考えてみてください。ユーザーが「あ、メールアドレスだけ変えたいな」と思ったとき、プロフィール編集画面から送信されてくるデータはどうなるでしょうか?
そう、「メールアドレスだけ」ですよね。名前や年齢は変えていないので、わざわざ送ってこないのが普通です。

ここで、TypeScriptの厳しいお約束を思い出してください。
「ねえ、この `User` 型のデータを受け取る関数を作ったんだけど、`name` も `age` も入ってないよ? エラーにしちゃうからね!」

……TypeScript君、それは困るよ!全部そろってないと怒られちゃうの? という場面で登場するのが、今回主役の `Partial` です。

—

2. `Partial` ってなに?(身の回りの例え話)

`Partial` を一言で言うと、「型 `T` のすべての項目(プロロパティ)に、こっそり `?`(オプショナル:あってもなくてもいいよ)の魔法をかけてくれる便利アイテム」 です。

イメージとしては、「オーダーメイドの注文書」 を思い浮かべてみてください。

最初から完璧に決まっているセットメニュー(通常の `User` 型)とは違って、`Partial` は、「どこを書き換えてもいいし、変えたいところだけ書いてね」 という自由な注文用紙に早変わりします。

  • 名前だけ変えてもいい
  • メールアドレスだけ変えてもいい
  • 全部空っぽでも、まあエラーにはならない(意味はないけど)

そんな「融通のきく状態」を、たった一語で作り出してくれるのが `Partial` なんです。

—

3. 実際のコードで動きを見てみましょう

百聞は一見に如かず。実際にエディタを叩く気持ちで、コードを見ていきましょう。

まずは、通常の厳しい世界から。

// ユーザーの型定義
interface User {
id: number;
name: string;
email: string;
age: number;
}

// ❌ エラーになる例
// ユーザーが「名前だけ」変えようとしたデータを送ってきたつもり
const updatingData: User = {
name: “新しい田中さん” // エラー! id, email, age が足りないよ!と怒られる
};

ここで、`Partial` の出番です。

// ⭕️ Partial を使った成功例
// 「Userのプロパティは全部なくてもOK(オプショナル)にするよ!」という意味
const updatingData: Partial = {
name: “新しい田中さん” // これならエラーになりません!
};

// メールアドレスだけ変えるのももちろんOK
const updatingEmailOnly: Partial = {
email: “new_tanaka@example.com”
};

どうですか? 「これだけでいいの?」と思うくらいシンプルですよね。
`Partial` が背後で、すべてのプロパティに `?` をペタペタと貼ってくれているおかげで、私たちは部分的なデータをスッキリと扱うことができるんです。

—

4. 実務でよくある使い方:データ更新関数(update関数)

では、もう少し実務っぽい例を見てみましょう。受け取った部分的なデータを使って、既存のユーザーデータを更新する関数を作ってみます。

interface User {
id: number;
name: string;
email: string;
age: number;
}

// データベースにある既存のユーザー(と仮定)
const existingUser: User = {
id: 1,
name: “山田太郎”,
email: “yamada@example.com”,
age: 28
};

/

  • ユーザー情報を更新する関数
  • @param id 更新したいユーザーのID
  • @param partialUser 変更したい部分だけのデータ(Partial型)

/
function updateUser(id: number, partialUser: Partial) {
// 実際のアプリではここでデータベースを書き換えます
console.log(`ID: ${id} のユーザーを更新します`, partialUser);
}

// — 実際に使ってみる —

// パターンA:名前と年齢だけ変えたい!
updateUser(1, {
name: “山田次郎”,
age: 29
});
// ちゃんと受け入れてもらえます。emailやidがなくても怒られません!

// パターンB:メールアドレスだけ変えたい!
updateUser(1, {
email: “jiro_yamada@example.com”
});
// これもバッチリOKです。

もしここで、`Partial` ではなく素の `User` 型を使ってしまうと、関数を呼び出すたびに「名前もメールも年齢もぜんぶ」渡し直さないといけなくなってしまいます。それは実務では大変ですよね。

—

5. つまずきやすいポイントと、チーフアーキテクトからのアドバイス

初心者の頃、`Partial` を使うと、うっかりハマりがちなポイントが一つだけあります。それは、「中身が存在するかどうか分からない」 という問題です。

function printUserEmail(user: Partial) {
// コンパイルエラーにはならないけれど……
// もし user に email が含まれていなかったら、表示したときに 「undefined」 になっちゃう!
console.log(user.email.toUpperCase());
}

`Partial` を使ったデータは、「プロパティが存在しない(`undefined` である)」可能性があるため、型安全な世界では「本当にそのデータ入ってる?」と優しくチェック(ガード)してあげる必要があります。

function printUserEmailSafe(user: Partial) {
// email が存在するかどうかを確認してから使う
if (user.email) {
console.log(user.email.toUpperCase()); // 安心!
} else {
console.log(“メールアドレスは更新されませんでした”);
}
}

「オプショナルにするということは、値がない世界線も考慮しなきゃいけないんだな」という感覚を少しずつ掴んでいってくださいね。

—

おわりに

TypeScriptの型ユーティリティ(`Partial` のような、型を加工する便利な仕組み)は、最初は魔法のように見えて少し身構えてしまうかもしれません。

でも、本質はとてもシンプルです。
「全部必須のままだと窮屈だから、部分的な更新のときは、ゆるふわ(任意)にしてあげようね」 という、TypeScriptからの優しい配慮なんです。

今日から、APIからのデータ更新や、フォームの入力途中の状態を管理する場面などで、ぜひこの `Partial` を相棒として使ってみてください。あなたのコードが、ぐっと書きやすく、そして柔軟になりますよ。

それでは、また次のTipsでお会いしましょう!Happy Coding!

コメント

タイトルとURLをコピーしました