こんにちは。TypeScriptの世界へようこそ。
「型定義」と聞くと、なんだか数学の授業みたいで身構えてしまうかもしれませんね。でも大丈夫。TypeScriptの`number`型は、私たちが普段、お財布の中の小銭を数えたり、レジの合計金額を見たりする感覚とほとんど同じです。
今日は、そんなTypeScriptの「数字」の扱いについて、少しだけ深く、でも優しく紐解いていきましょう。
—
1. number型:TypeScriptが扱う「数字」の正体
TypeScriptの世界では、すべての数字は`number`という一つの大きな箱に入れられます。
ここが面白いところなのですが、TypeScriptの`number`は、世の中のすべての数字を「一つの種類」として扱います。整数(1, 2, 3…)も、小数点(3.14…)も、さらにはちょっと特殊な「計算できない状態」ですら、同じ`number`という名前で呼ばれるんです。
// 整数も、小数点も、全部同じ「number型」です
let appleCount: number = 5; // 整数
let price: number = 198.5; // 小数点(消費税計算などでよく見ますね)
// 実はこんなものもnumber型です
let infinityValue: number = Infinity; // 無限大
let notANumber: number = NaN; // 数値じゃないのにnumber型!?
なぜ「計算できないもの」までnumberなの?
不思議に思いますよね。`NaN`(Not a Numberの略)は、「計算した結果、数字として成立しなかったもの」を指します。例えば「0で割った結果」や「数字ではない文字を計算しようとした時」に出てきます。
TypeScriptは「数字を扱おうとして失敗した結果も、数字の計算という文脈から生まれたものだから、同じ`number`の箱に入れておこう」という大らかなルールを採用しているんです。エラーを出すより、あえて許容して「あとでチェックしよう」という現場の知恵ですね。
—
2. 数値リテラル型:特定の数字しか認めない「こだわり」
さて、少しレベルアップしましょう。単に「数字なら何でもいい」のではなく、「この変数には『1』か『2』しか入れさせない!」という厳しいルールを作ることができます。これを数値リテラル型と呼びます。
例えば、お買い物サイトの「送料」を考えてみましょう。送料は「0円(送料無料)」か「500円(通常送料)」のどちらかしかないはずですよね?
// 型の場所に具体的な数字を書くと、それが制約になります
type ShippingFee = 0 | 500;
let myShipping: ShippingFee = 0; // OK!
// let badShipping: ShippingFee = 300; // エラー!「0か500以外はダメ」と怒られます
これは非常に強力です。後からコードを見た人が、「あれ、ここに300円って入ることはあるのかな?」と悩む必要がなくなります。コード自体が説明書になっている状態ですね。
—
3. よくある落とし穴:BigIntとの違い
実務で時々つまずくのが`BigInt`です。`number`型は、実は「すごく大きな数字」が苦手です。正確に言うと、あまりに大きな数になると、誤差が生じ始めます。
- number: 普段使いの電卓(便利だけど桁数に限界がある)
- BigInt: 科学計算用のスーパーコンピュータ(どんなに大きくても正確)
もし、銀行の口座残高のような「一円の狂いも許されない超巨大な数字」を扱うなら、`number`ではなく`bigint`という別の型を使います。
let normalNumber: number = 9007199254740991; // これがnumberの限界値に近い数字です
let bigNumber: bigint = 9007199254740991n; // 末尾に n をつけるとBigIntになります
最初は`number`だけで十分ですが、「あれ、数字が変なふうに切り捨てられるな?」と思ったら、この`BigInt`を思い出してくださいね。
—
最後に:完璧を目指さなくて大丈夫
TypeScriptの型定義は、コードを縛り付けるための鎖ではありません。むしろ、「あなたがコードを書いているときに、未来の自分やチームメンバーが迷わないようにするための地図」です。
最初は`number`だけで定義して、必要に応じて「あ、ここは0か1しか入らないからリテラル型にしよう」と、後から書き換えていけばいいんです。プロの現場でも、最初から完璧な設計なんてありません。
まずはエディタを開いて、適当な数字を変数に入れてみてください。そして、あえて`string`(文字列)を代入して、赤い波線(エラー)が出てくる様子を眺めてみましょう。「あ、TypeScriptがちゃんと見守ってくれているな」と実感できるはずです。
その感覚こそが、上達への第一歩ですよ。応援しています!

コメント