【入門編】 Pickによる部分型の抽出 – TypeScript実践ガイド

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

現場の第一線でバリバリとコードを書いていると、「あ、この巨大なデータ構造から、ほんの一部だけ抜き出して使いたいな」という場面に、ものすごく頻繁に遭遇します。全部のプロパティを持ち歩くのは、まるで一泊二日の旅行に行くのに、婚礼用の大きなタンスごと持ち歩くようなもので、どう考えてもオーバーですよね。

そんなときに私たちの強い味方になってくれるのが、今回お届けするユーティリティ型、`Pick` です。

今回は、TypeScriptを始めたばかりのあなたが「なるほど、そういうことね!」と膝を打てるよう、身近な例えを交えながら、この魔法のような機能の裏側を優しく、そして徹底的に紐解いていきたいと思います。どうぞ肩の力を抜いて、リラックスして読んでいってくださいね。

—

1. `Pick` ってなんだろう? お買い物でたとえてみる

まずは、難しいコードのことは少し横に置いておきましょう。

想像してみてください。あなたは今、近所の大きなおもちゃ屋さん(または家電量販店)にいます。そこには、1つの商品につき、以下のようなめちゃくちゃ細かい情報(データ)がタグとしてくっついています。

  • 商品名(name)
  • 値段(price)
  • メーカー(maker)
  • 在庫数(stock)
  • 重さ(weight)
  • 倉庫の保管場所(warehouseLocation)

お会計のレジや、商品の詳細ページ全体を表示するならこの「全部入り情報」が必要ですが、例えば今あなたが作っているのは「お買い物のカート画面(リスト表示)」だとしましょう。

カート画面でユーザーに見せたいのは、ぶっちゃけ「商品名」と「値段」だけで十分ですよね? 重さや倉庫の場所まで一覧画面に出していたら、画面がごちゃごちゃして見づらくなってしまいます。

ここで、お店のカタログ(大きな型)の中から、「商品名」と「値段」という特定のパーツだけを「ピシャッ!」とつまみ食い(ピック)して新しい型を作る。これが、`Pick` の正体です。

英語の “Pick(選んで取る)” そのままの意味なので、イメージしやすいのではないでしょうか?

—

2. 基本のキ:実際にコードで見てみよう

それでは、このお買い物の例を、実際のTypeScriptのコードに落とし込んでみましょう。

まずは、すべてが詰まった「全部入り」の型(これを `T` と呼びます)を定義します。

// お店にある商品の、すべての情報が詰まった「全部入り」の型
interface Product {
id: number;
name: string;
price: number;
maker: string;
stock: number;
weight: number;
warehouseLocation: string;
}

「うわ、プロパティがいっぱいで目が回る……」と思いましたか? 大丈夫ですよ、安心してください。ここから `Pick` を使って、カート画面用に必要なものだけをスマートに切り出してみます。

// Product型の中から、’name’ と ‘price’ だけを「ピック」して新しい型を作る
type CartItem = Pick;

// できた型(CartItem)を使ってみる
const myCartItem: CartItem = {
name: ‘スーパーファミコン風Bluetoothキーボード’,
price: 6800,
// 試しに、makerやstockを入れようとすると…?
// maker: ‘Nintendo’ -> 【エラー!】そんなプロパティは許可されていません
};

見てください! `CartItem` 型には、元となった `Product` 型の中から `’name’` と `’price’` しか存在していません。そのため、余計なデータをうっかり混ぜ込んでしまうバグを、エディタが未然にバチッと防いでくれるのです。これが型の恩恵であり、実務で私たちが手放せない理由です。

—

3. `Pick` の仕組みを分解する

もう少しだけ、頭の中を整理するために「仕組みの解剖」をしてみましょう。

`Pick` は、TypeScriptがあらかじめ用意してくれている「便利な型を作るための型(ユーティリティ型)」の一つです。書き方のルールはこうなっています。

Pick<もとの型, 抜き出したいプロパティの名前>

ここでポイントなのが、2つ目の引数(Kの部分)です。複数のプロパティを指定したいときは、TypeScriptの「ユニオン型(`|` = または)」を使って、`’prop1′ | ‘prop2’` のようにパイプラインで繋ぎます。

「あ、HTMLのCSSセレクタや、JavaScriptの条件分岐なんかで見たことある!」という記号ですよね。あの `|` と同じ感覚で、欲しいプロパティを並べていくだけでOKです。

—

4. 実務の現場でどう役立つ? つまずきやすいポイントと対策

初心者の方がよくやってしまうのが、「すべてのデータに対して、毎回新しい `interface` を手打ちで何個も作ってしまう」というミスです。

例えば、こんな風に書いていませんか?

// ❌ やりがちな書き方(非効率)
interface UserProfile {
id: string;
name: string;
email: string;
age: number;
address: string;
}

interface UserCardPreview {
id: string;
name: string;
}

interface UserEmailOnly {
id: string;
email: string;
}

これだと、もし元の `UserProfile` に「電話番号(phone)」が追加されたとき、他の型もぜーんぶ手動で書き直さなきゃいけなくなります。人間、絶対に書き忘れます。そしてそこからバグが生まれます(笑)。

ここで `Pick` の出番です。大元の型を一つドーンと決めておいて、派生する型はすべてそこから引き算、あるいは部分抽出するようにしましょう。

// ⭕️ プロフェッショナルな書き方
interface UserProfile {
id: string;
name: string;
email: string;
age: number;
address: string;
}

// ユーザー一覧のカード表示には、idとnameだけ!
type UserCardPreview = Pick;

// 通知を送る機能には、idとemailだけ!
type UserEmailOnly = Pick;

これなら、大元の `UserProfile` さえ修正しておけば、そこから派生している `UserCardPreview` や `UserEmailOnly` も自動的に追従してくれます。保守性が爆上がりですね!

—

5. まとめと、あなたへのエール

今回は、TypeScriptの基本の型定義をさらに便利にする `Pick` についてお話ししました。

  • `Pick` とは:大きな型 `T` から、必要なプロパティの集合 `K` だけを摘み出して、新しい型を作るためのもの。
  • メリット:コードの重複をなくし、大元の変更に強い(メンテナンス性の高い)安全なコードが書けるようになる。

最初は「なんか記号が多くて難しそう…」と感じるかもしれませんが、実際にエディタを開いて `Pick<` と打って補完が出てきたときの「おお、動いた!」という小さな感動の積み重ねが、あなたを確実にTypeScript使いへと成長させてくれます。 もしコード書いていて「あ、ここエラーになったどうしよう」と手が止まったら、深呼吸をして、このブログ記事をまた覗きに来てくださいね。 あなたのフロントエンド開発の旅が、明日も楽しく素晴らしいものになりますように。チーフアーキテクトの私でした!それではまた。

コメント

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