【入門編】 プリミティブ型とラッパーオブジェクト型 – TypeScript実践ガイド

こんにちは!TypeScriptの世界へようこそ。
日々、フロントエンドの最前線でコードを書いていると、「動けばいいや」という気持ちと「もっと美しく、堅牢なコードにしたい」という葛藤が必ずやってきます。

今日は、TypeScriptを始めたばかりの人が必ずと言っていいほど一度は迷い込む、「プリミティブ型」と「ラッパーオブジェクト型」という、一見地味だけど実はめちゃくちゃ大事な境界線についてお話ししますね。

ここを理解するだけで、あなたのコードから「なぜか動かない!」という謎のエラーが劇的に減るはずです。肩の力を抜いて読んでみてください。

—

1. 「値」と「箱」のイメージで理解しよう

まずは、身近な例えから入りますね。
「お買い物」を想像してください。

  • プリミティブ型(`string`, `number`など):これは「商品そのもの」です。リンゴが1個、あるいは「りんご」という名前のラベル。シンプルで、それ以上でもそれ以下でもありません。
  • ラッパーオブジェクト型(`String`, `Number`など):これは「商品が入った豪華なギフトボックス」です。中身は同じリンゴでも、わざわざ箱に入れてリボンをかけた状態です。

TypeScriptで私たちが普段扱うのは、基本的に「商品そのもの(プリミティブ)」だけで十分なんです。それなのに、なぜわざわざ「箱(ラッパーオブジェクト)」を使うとトラブルになるのでしょうか?

—

2. なぜ「大文字」の型を使ってはいけないのか?

TypeScriptで型を指定するとき、小文字の `string` や `number` を使うのが正解です。しかし、たまに間違えて大文字の `String` や `Number` を書いてしまうことがありますよね。

実は、TypeScriptにおける `String`(大文字)は、「文字列そのもの」ではなく「文字列を包んだオブジェクト」を指してしまいます。これがバグの温床になります。

実際にコードで見てみましょう

// ✅ 正しい書き方:プリミティブ型
const myName: string = “TypeScript太郎”;

// ❌ 避けるべき書き方:ラッパーオブジェクト型
const myNameWrong: String = new String(“TypeScript太郎”);

// ここで何が起きるか?
console.log(myName === “TypeScript太郎”); // true (値が一致する!)
console.log(myNameWrong === “TypeScript太郎”); // false (えっ!?)

なぜ `false` になるのか?
`myNameWrong` は「文字列」という中身そのものではなく、「文字列を含んだオブジェクトという『箱』」だからです。中身が同じでも、箱の種類が違えば「これは別物だ!」と判定されてしまう。これが、if文などで意図しない挙動を引き起こす一番の原因なんです。

—

3. なぜ「プリミティブ型」だけで幸せになれるのか

現場のエンジニアが「小文字で書け!」と口を酸っぱくして言うのには、深い理由があります。

1. 直感的であること:数値は数値、文字は文字。余計なメタデータが付いてこないので、計算や比較がスムーズです。
2. メモリに優しい:箱(オブジェクト)を作るということは、それだけでメモリを消費します。アプリが大きくなればなるほど、この小さな「箱」の積み重ねがパフォーマンスを低下させる原因になります。
3. 型安全(Type Safety):`string` と指定すれば、それは「間違いなく文字列だ」と確信を持って扱えます。一方で `String`(オブジェクト)を許容してしまうと、予期せぬメソッドが紛れ込んだりして、TypeScriptが本来持っている「守ってくれる力」が弱まってしまうんです。

—

4. つまずいたあなたへ:大丈夫、怖くないですよ

もし、これまで大文字で型を書いてしまっていたとしても、自分を責める必要は全くありません!プロの現場でも、最初は誰でもやってしまうミスです。

今のうちに、エディタの設定を見直してみるのも一つの手です。
ESLintなどのツールを使っていれば、`@typescript-eslint/no-wrapper-object-types` というルールをオンにするだけで、エディタが「それ、小文字にしたほうがいいよ!」と優しく教えてくれるようになります。

まとめ:今日からできる小さな習慣

  • 型定義は必ず小文字!:`string`, `number`, `boolean`。この3つを基本にしましょう。
  • 「箱」は作らない:特別な理由がない限り、`new String()` や `new Number()` といった書き方はコードから追い出しましょう。
  • シンプルが一番の正義:複雑なことをするよりも、素直なデータ型を使う方が、未来の自分がコードを読んだときに「ああ、分かりやすい!」と感謝されるはずです。

TypeScriptは、あなたのコードをより安全に、より速くするための最高の相棒です。この「型」の意識を持つだけで、あなたは一歩、また一歩とフロントエンド・スペシャリストに近づいていますよ。

また分からないことがあれば、いつでも聞きに来てくださいね。あなたの開発ライフを応援しています!

コメント

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