【入門編】 typeof演算子による型抽出 – TypeScript実践ガイド

やあ、ようこそ。TypeScriptの世界へ。
私は長年、数えきれないほどのプロジェクトでコードの荒波に揉まれてきたチーフアーキテクトです。

今日は、TypeScriptを学び始めたばかりのあなたが、おそらく一番最初に「おっ、これは魔法みたいだ!」と感動するであろう、`typeof` 演算子による型抽出についてお話ししましょう。

「型を定義する」というと、なんだか几帳面にノートの線を引くような、ちょっと堅苦しい作業に感じるかもしれません。でも、この `typeof` をマスターすれば、もっと自由で、もっと「楽」ができるようになりますよ。

肩の力を抜いて、温かいコーヒーでも飲みながら読んでみてください。

—

1. そもそも「型」って、いちいち書かなきゃダメなの?

プログラミングをしていると、例えば「設定値(設定ファイル)」のようなものを作ることがよくあります。

// Webサイトのテーマカラーを決める「設定値」
const themeColor = {
primary: “#3498db”,
secondary: “#2ecc71”,
background: “#f5f5f5”,
text: “#333333”
};

これに対して型を付けようと思うと、普通はこう書きますよね。

type Theme = {
primary: string;
secondary: string;
background: string;
text: string;
};

const themeColor: Theme = { … };

でも、ちょっと待ってください。「値(中身)」はもう目の前にあるのに、なんでまた同じような「型」を手書きしなきゃいけないんだ? って思いませんか? 私は思います(笑)。

現場の泥臭い話をすると、開発が進むにつれて「あ、やっぱり `border` の色も追加したいな」なんてことは日常茶飯事です。そのたびに「値」を書き換え、「型」も書き換える……。これは面倒ですし、いつか必ずどちらかを忘れてエラーの原因になります。

ここで登場するのが、魔法の杖 `typeof` です。

—

2. `typeof` は「現物から型をコピーする」スタンプ

TypeScriptの `typeof` 演算子は、一言で言うと「すでにある実物(値)をチラッと見て、その形をそのまま型として抜き出す」という機能です。

お買い物の例えで考えてみましょう。
あなたは、お気に入りの「マグカップ」と同じサイズのケースが欲しいとします。わざわざ定規でミリ単位のサイズを測って(=型を手書きして)注文するのは大変ですよね。

それよりも、「このマグカップと同じサイズのやつをください!」と現物を指差すほうがずっと簡単です。それが `typeof` なんです。

さっそくコードを見てみましょう。

// 1. まずは「実物(値)」を作る
const pointCard = {
id: “888-1234”,
points: 1500,
isPremium: true
};

// 2. 「この実物と同じ型」を typeof で一瞬で作る!
type Card = typeof pointCard;

/
これで、変数 Card の中身は自動的にこうなります:
{
id: string;
points: number;
isPremium: boolean;
}
/

// 3. 安心して新しいデータを作れる
const myNewCard: Card = {
id: “999-5678”,
points: 0,
isPremium: false
};

どうですか? 自分で `string` だの `number` だのと書かなくても、TypeScriptが「はいはい、`pointCard` をマネすればいいんですね、了解!」と、背後で自動的に型を組み立ててくれたんです。

—

3. なぜこれが「現場」で喜ばれるのか?

「単にサボれるだけじゃないの?」と思うかもしれませんが、実はこれが「堅牢なコード」に繋がります。

例えば、あなたが大規模なECサイトを作っていて、商品カテゴリーのリストがあるとしましょう。

// 現場でよくある「カテゴリーリスト」
const CATEGORIES = [“Electronics”, “Books”, “Fashion”, “Home”];

// このリストの中身だけを「型」として使いたい!
// そんな時も typeof と、ちょこっとしたテクニックで解決
type Category = (typeof CATEGORIES)[number];
// ↑これで “Electronics” | “Books” | “Fashion” | “Home” という型になる

もし明日、上司から「新しく『Food』カテゴリーを追加してくれ」と言われたら?
あなたは `CATEGORIES` 配列に `”Food”` を追加するだけ。型定義の方は、`typeof` が勝手に追随してくれるので、修正漏れが起きません。

「一箇所直せば、全部に反映される」。これこそが、私たちエンジニアが愛してやまない「DRY(Don’t Repeat Yourself:繰り返すな)」の精神です。

—

4. つまずきポイント:JavaScriptの `typeof` とは何が違うの?

ここ、初心者の皆さんが一番「えっ?」となるポイントです。実は、JavaScript(実行時)にも `typeof` という言葉が存在します。

  • JavaScriptの `typeof`:

プログラムが動いている最中に、「これは数字かな? 文字かな?」と調べるためのもの。結果は `”string”` や `”object”` という「文字列」で返ってきます。

  • TypeScriptの `typeof`:

コードを書いている最中に、エディタ上で「この変数の型を抽出して!」とお願いするもの。結果は「TypeScriptの型」として返ってきます。

見分け方は簡単。「型の定義(`type` や `interface` の右側など)」で使っていれば、それはTypeScriptの魔法です。

const message = “Hello!”;

// これは JavaScript の typeof(値としての判定)
const result = typeof message;
console.log(result); // “string” と表示される

// これは TypeScript の typeof(型としての抽出)
type MessageType = typeof message;
// MessageType は「string型」になる

最初はこんがらがるかもしれませんが、「型を書きたい場所で使えば、型を連れてきてくれるんだな」くらいの理解で大丈夫ですよ。

—

5. 最後に:完璧主義を捨てて、楽しもう

TypeScriptを始めたばかりの頃は、「すべての型を完璧に、美しく定義しなきゃ……」と自分を追い込んでしまいがちです。でも、実務の現場では、この `typeof` のように「今あるものから賢く型を盗む」という柔軟な考え方がとても大切になります。

まずは、身近なオブジェクトや配列に `typeof` を使ってみて、VSCodeでマウスをホバー(上に置く)してみてください。TypeScriptがあなたの代わりに一生懸命、型を導き出してくれる様子が見えるはずです。

「あ、TypeScriptが自分の意図を分かってくれた!」
その瞬間の喜びが、あなたを最高のエンジニアへと成長させてくれます。

大丈夫、一歩ずつ進んでいきましょう。もし分からなくなったら、いつでもこの場所に戻ってきてくださいね。応援していますよ!

コメント

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