やあ、TypeScriptの世界へようこそ。言語の深淵を覗こうとする君のような姿勢、最高だね。
今日はTypeScript 5.0で導入された「const型パラメータ(const Type Parameters)」という、型システムの常識を覆す強力な機能について解説しよう。
これを知れば、君の書くコードは一段上の「堅牢さ」と「柔軟性」を同時に手に入れることになる。さあ、深掘りしていこうか。
—
1. なぜ「型が広がる(Widening)」のか?
まずは、TypeScriptが抱える「ちょっとおせっかいな性質」について知っておこう。
普通、変数に値を代入すると、TypeScriptはその値を「一般的な型」に広げて解釈しようとするんだ。これを型ワイドニング(Type Widening)と呼ぶ。
// 普通の変数
const config = { mode: “dark” };
// TypeScriptの推論: { mode: string; }
見ての通り、`”dark”`という具体的なリテラル型だったはずが、`string`という広すぎる型に抽象化されてしまったよね。もし関数にこのオブジェクトを渡すと、受け取る側は「どんな文字列でも来るかもしれない」と警戒しなければならなくなる。
これが今までのTypeScriptにおける「もどかしさ」だったんだ。
—
2. const型パラメータ:リテラルを「封印」する
TypeScript 5.0で登場したのが、この「const型パラメータ」。関数のジェネリクス部分に `const` を添えるだけで、渡された値を「読み取り専用の具体的なリテラル型」として推論させることができる。
書き方はこうだ。
// T の前に const を置く。これだけで魔法がかかる
function configure
return config;
}
const settings = configure({
mode: “dark”,
retries: 3
});
// settings の型はこれになる:
// {
// readonly mode: “dark”;
// readonly retries: 3;
// }
見てほしい。`string` や `number` に広がることなく、`”dark”` や `3` という具体的な型がそのまま保持されているよね。さらに、自動的に `readonly`(読み取り専用)が付与される。
これが、コンパイル時に型情報を「固定」するということの本質なんだ。
—
3. なぜこれが「現場」で最強なのか?
この機能が真価を発揮するのは、「設定オブジェクト」や「ルート定義」「コマンドの定義」を扱うときだ。
例えば、ユーザーの権限レベルを定義する関数を作るとしよう。
function definePermissions
return roles;
}
const myRoles = definePermissions([“admin”, “editor”, “viewer”]);
// myRoles[0] は “admin” 型として推論される。
// もしここで “guest” 以外の文字列を渡そうとすると、
// 型定義に存在しないため、即座にコンパイルエラーを出せる!
今までは `as const` を使って手動でキャストしていた作業が、この機能を使えば関数の呼び出し側で自然に行える。コードが極めてクリーンになるのが分かるだろう?
—
4. 陥りやすい罠と注意点
初心者がよくやってしまうのが、「すべてをconst型パラメータにする」というミスだ。
罠:柔軟性が死ぬ
`const` をつけると、その引数は「リテラルそのもの」を要求するようになる。例えば、外部から取得した動的な変数を渡そうとすると……
const userMode = “dark”; // これはただの string 型
// エラー! “dark” 型を期待しているのに string 型が渡された!
configure({ mode: userMode });
`const` を付けるということは、「実行時の動的な値を許容しない」という強い宣言でもあるんだ。「設定値や固定の定数データ」には `const` を使い、「動的に変化するデータ」には使わない。 この使い分けが、一流のTypeScriptエンジニアの境界線だよ。
—
まとめ:TypeScriptを掌握するために
今日学んだことを整理しよう。
- 型ワイドニング: TypeScriptはデフォルトで型を抽象化したがる。
- const型パラメータ: `
` と書くことで、リテラル型を保持し、`readonly` を付与できる。 - 使いどころ: 設定値や固定データなど、「具体的であることに価値がある場所」に使う。
型システムは、君がコンパイラに対して「このデータはこれ以上変化しないよ」という意思を伝えるための言語だ。`const` 型パラメータを使いこなせば、コンパイラは君の意図を完璧に理解し、実行時のバグを未然に防ぐ最強の盾になってくれるはずだ。
次はぜひ、君のプロジェクトにある「設定用の定数オブジェクト」に、この `
また何かあったら、いつでも聞いてくれ。君のコードが最高に美しくなることを応援しているよ。