リテラル型
CoddyのLuaジャーニー「Luau入門」セクションの一部 — レッスン 33/73。
string のような型は任意の文字列を許可しますが、時にはいくつかの正確な値のみが意味を持つ場合があります。リテラル型(literal type)は、値そのものを型として使用します:
local mode: "dark" = "dark" -- 文字列 "dark" のみが許可されています
local locked: true = true -- ブール値 true のみが許可されています単一の値の型だけでは、単なる興味深い機能に過ぎません。しかし、ユニオン型(unions)と組み合わせることで、許可される値のセットを厳格に制御する Luau の最も有用なツールの 1 つになります:
type Direction = "north" | "south" | "east" | "west"
type GameState = "menu" | "playing" | "paused" | "gameover"
local move: Direction = "north" -- ✓
local state: GameState = "playing" -- ✓
-- local bad: Direction = "diagonal" -- ✗ 型エラー!これにより、"nort" のようなタイポや "diagonal" のような無効な値は編集時に検出されます。普通の string であれば、運良く気付くことができない限り、そのまま通り抜けて実行時にエラーを引き起こしてしまうでしょう。
リテラル型は大文字と小文字を区別し、正確です:"North" は "north" と一致しません。文字列リテラルが一般的なユースケースですが、boolean や(新しい Luau バージョンでは)数値リテラルも同様に動作します。このパターン — 文字列リテラルのユニオン型 — は、後述の章で説明するように、Luau が他の言語の enum を置き換える方法でもあります。
チャレンジ
簡単3つのリテラルユニオン型エイリアスを作成します:
Direction="north" | "south" | "east" | "west"GameState="menu" | "playing" | "paused" | "gameover"Difficulty="easy" | "medium" | "hard"
作成したエイリアスを使用して、以下を宣言します:
playerDirection: Direction="north"currentState: GameState="playing"selectedDifficulty: Difficulty="medium"
"Moving [direction]" を返す関数 movePlayer(direction: Direction): string と、"Game state: [state]" を返す関数 updateGameState(state: GameState): string を作成します。
以下をそれぞれ新しい行に出力します:
movePlayer(playerDirection)updateGameState(currentState)selectedDifficultyの値
自分で試してみよう
-- ここにコードを書いてください
-- Direction / GameState / Difficulty をリテラルユニオンとして型定義する
-- playerDirection, currentState, selectedDifficulty を宣言する
-- movePlayer(direction: Direction): string -> "Moving [direction]"
-- updateGameState(state: GameState): string -> "Game state: [state]"
-- 3つの結果を出力する
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
Luau入門のすべてのレッスン
7プロジェクト:Typed Task Manager
プロジェクト:タスクの型定義タスクを追加する関数