リテラル型
| 対応: | TypeScript 1.0(2014) |
|---|
特定の値そのものを型として扱う機能です。文字列や数値の具体的な値を型にすることで、許可される値を厳密に制限できます。『as const』と組み合わせると、オブジェクトや配列全体をリテラル型で固定できます。
構文
// 文字列リテラル型
let 変数名: "値" = "値";
// 数値リテラル型
let 変数名: 1 | 2 | 3 = 1;
// as const: 値をリテラル型として固定します。
const 変数名 = "値" as const; // 型は"値"(stringではなく)になります。
const オブジェクト = { key: "値" } as const; // すべてのプロパティがreadonly & リテラル型になります。
構文一覧
| 構文 | 概要 |
|---|---|
| "値"(文字列リテラル型) | 特定の文字列値のみを受け付ける型です。ユニオン型と組み合わせて選択肢を列挙するのに使います。 |
| 数値リテラル型 | 特定の数値のみを受け付ける型です。ダイスの目や状態コードの制限に使います。 |
| true / false(真偽値リテラル型) | trueまたはfalseのいずれか片方に固定した型です。 |
| as const | 変数の型をリテラル型に広げず固定します。オブジェクト・配列にも使えます。 |
| typeof obj[keyof typeof obj] | as constオブジェクトの値型をユニオンとして取り出すイディオムです。 |
サンプルコード
// 文字列リテラル型: 特定の文字列だけ許可します。
type Direction = "north" | "south" | "east" | "west";
let move: Direction = "north";
// move = "up"; // エラー: "up"はDirection型にありません。
// 数値リテラル型: 1〜6のみ許可します。
type DiceValue = 1 | 2 | 3 | 4 | 5 | 6;
let roll: DiceValue = 3;
// roll = 7; // エラー: 7はDiceValue型にありません。
// 関数の引数にリテラル型を使います。
function setTheme(theme: "light" | "dark"): void {
console.log(`テーマを${theme}に切り替えました`);
}
setTheme("dark"); // 正常に動作します。
// setTheme("blue"); // エラー: "blue"は許可されていません。
// as const: 変数の型をリテラル型に固定します。
const status = "active" as const; // 型は string ではなく "active" になります。
// let status = "active"; // こちらはstring型になります。
// as constをオブジェクトに使います。
const Config = {
host: "localhost",
port: 3000,
mode: "development",
} as const;
// Config.port = 8080; // エラー: readonlyのため変更できません。
console.log(Config.host); // 『localhost』と出力されます。
// as constオブジェクトから値型を取り出します。
const INSPECTORS = {
Division1: "kogami",
Division2: "tsunemori",
Division3: "ginoza",
} as const;
type Inspector = typeof INSPECTORS[keyof typeof INSPECTORS]; // "kogami" | "tsunemori" | "ginoza"
let lead: Inspector = "kogami";
console.log(lead); // 『kogami』と出力されます。
実行すると次のように出力されます。
npx ts-node ts_literal_type.ts テーマをdarkに切り替えました localhost kogami
概要
リテラル型は「特定の値そのもの」を型として使う機能です。文字列・数値・真偽値に適用でき、ユニオン型と組み合わせることで「この3つの文字列のどれか」という型を表現できます。これにより、関数に渡す引数の値を厳密に制限でき、タイプミスをコンパイル時に検出できます。
『as const』アサーションは、値の型推論を「最も狭い(具体的な)型」に固定します。通常、`let x = "hello"` と書くとTypeScriptは型を`string`(広い型)と推論しますが、`const x = "hello" as const` とすると型は `"hello"`(リテラル型)になります。オブジェクトに適用すると、すべてのプロパティが`readonly`かつリテラル型になります。
『as const』はenumの代替として使われることもあります。enumがコンパイル後にJavaScriptオブジェクトを生成するのに対し、as constオブジェクトはそのまま残るため、バンドルサイズの点で有利な場合があります。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。