booleanリテラル型とは何か
booleanリテラル型は、「true だけ」「false だけ」といった、特定の真偽値だけを許可する型です。
普通の boolean 型は「true か false のどちらでもOK」ですが、booleanリテラル型は「この変数は絶対に true にしかならない」「この値は false 固定」といった、もっと狭い世界を表現します。
let b1: boolean;
b1 = true;
b1 = false; // どちらもOK
let b2: true;
b2 = true; // OK
// b2 = false; // エラー:false は true 型に代入できない
TypeScriptb2 の型は boolean ではなく、「値が true のときだけ許される型」です。
これが booleanリテラル型の一番シンプルなイメージです。
booleanリテラル型とユニオン型
「true か false だけ」をあえて型で表現する
booleanリテラル型は、true と false をユニオンして使うこともできます。
type Flag = true | false;
let f: Flag = true;
f = false;
TypeScriptこれは実質 boolean と同じですが、「この型は boolean の別名だ」と明示したいときに使うこともあります。
ただ、実務的には「true だけ」「false だけ」を表現する場面の方が多いです。
「この関数は必ず true を返す」などを型で表現する
たとえば、「チェック関数だけど、現状は必ず成功(true)を返す」といった場面で、戻り値を true 型にすることができます。
function alwaysTrue(): true {
return true;
// return false; // エラー
}
TypeScriptこれは少し極端な例ですが、「この関数は絶対に false を返さない」ということを型で保証できます。
const と booleanリテラル型の関係
const で宣言すると自動的にリテラル型になる
const で boolean を宣言すると、その変数は多くの場合「booleanリテラル型」として扱われます。
const IS_PROD = true;
// IS_PROD の型は true
let isProd2 = true;
// isProd2 の型は boolean
TypeScriptconst IS_PROD は再代入できないので、「この変数は一生 true のまま」とコンパイラは判断できます。
その結果、型としても true というリテラル型にまで絞り込めます。
一方 let isProd2 は、将来 false になるかもしれないので、「boolean 全体」として扱われます。
定数フラグと型をリンクさせる
この性質を使うと、「定数フラグ」と「型」をきれいに結びつけられます。
const FEATURE_ENABLED = true as const;
type FeatureFlag = typeof FEATURE_ENABLED; // true 型
let flag: FeatureFlag = FEATURE_ENABLED;
// flag = false; // エラー
TypeScript「このフラグは常に有効」という前提を、値と型の両方で固定できます。
booleanリテラル型が役に立つ場面
条件分岐の結果を「固定」したいとき
型の絞り込み(ナローイング)と組み合わせると、booleanリテラル型は自然に登場します。
function isString(value: unknown): value is string {
return typeof value === "string";
}
TypeScriptここで value is string という戻り値の型は、「この関数が true を返したとき、その value は string だとみなしていい」という型レベルの約束です。
実際の戻り値は true / false の boolean ですが、「true のときだけ特別な意味を持つ」という形で、booleanリテラル型の考え方が使われています。
「この状態では必ず true / false」と分かるコードを書く
たとえば、状態管理の中で「このフラグは、ある条件の中では必ず true だ」と分かるように書くと、TypeScript がその情報を活かしてくれます。
type State = {
loaded: boolean;
data?: string;
};
function handle(state: State) {
if (state.loaded === true) {
// ここでは loaded は true 型に絞り込まれているイメージ
console.log("読み込み済み");
} else {
console.log("読み込み中");
}
}
TypeScriptここでは明示的に true 型とは書いていませんが、state.loaded === true のブロック内では、「loaded は true である」という前提が型システムに伝わります。
booleanリテラル型は、こうした「条件による型の絞り込み」とセットでよく登場します。
初心者がまず掴んでおきたい booleanリテラル型の感覚
booleanリテラル型は、こう捉えると分かりやすいです。
boolean は「true か false のどちらでもOK」true 型は「true だけOK」false 型は「false だけOK」
そして、実際のコードの中では、
const IS_PROD = true のような「変わらないフラグ」value is string のような「true のときだけ特別な意味を持つ判定」
といった形で、じわっと使われています。
最初から無理に多用する必要はありませんが、
「ここ、本当は true 固定なんだよな」
「この関数は false を返さない前提なんだよな」
と感じる場所が出てきたら、「それを型で表現できないか?」と一度考えてみる。
その視点を持ち始めたとき、あなたのTypeScriptは「ただの型付きJavaScript」から、「意図を型に刻んだ設計の道具」に変わっていきます。
