型アサーション
CoddyのLuaジャーニー「Luau入門」セクションの一部 — レッスン 68/73。
時として、Luauのタイプ checker よりも値について詳しく知っている場合があります。例えば、実際には user レコードであることが分かっている any 型の data などです。型アサーション(cast とも呼ばれます)を使用すると、checker に対して「私を trust して、この値をこの type として扱ってください」と伝えることができます。Luauの cast 演算子は :: です:
type User = {id: number, username: string}
local raw: any = {id = 42, username = "alice_dev"}
local user = raw :: User
print(user.username) -- チェッカーはフィールドを知るようになったcast は checker が信頼する内容のみを変更し、実行時には何も行いません。値を変換することは一切ありません:"5" :: any は still 文字列の "5" であり、number の 5 ではありません(実際の変換には tonumber を使用してください)。また、検証も行いません:wrong 型をアサーションしても、cast 自体がエラーを発生させることはありません — 存在しない fields にアクセスした際、later でコードが意図しない挙動をするだけです。
いつ使用するか: 値が any(または広範なユニオン型)として到着し、その shape を確実に入手・把握している場合です。いつ使用すべきでないか: 理解していない型エラーを黙らせるためです — エラーは通常、本物のバグを伝えており、cast で消し去ることはそれを隠すだけにすぎません。実行時に検証できる場合は、リアルなチェック(次のレッスンで学ぶ typeof ガードなど)を優先してください。
チャレンジ
簡単型情報なしで外部ソースから到着するレコードの処理をシミュレートします。
type User = {id: number, username: string, isActive: boolean}を宣言します。::を使用してdataをUserにキャストし、文字列補間を用いて構築されたUser [id]: [username] (Active: [isActive])を返す関数describeUser(data: any): stringを記述します。
スターターコードは、すでに any と型付けされた3つの生レコードを定義しています。それぞれに対して describeUser を呼び出し、3つの結果を順に出力してください。
期待される最初の行: User 42: alice_dev (Active: true)
自分で試してみよう
-- 外部ソースからの生のレコード: `any` 型
local rawUser1: any = {id = 42, username = "alice_dev", isActive = true}
local rawUser2: any = {id = 15, username = "bob_admin", isActive = false}
local rawUser3: any = {id = 99, username = "charlie_user", isActive = true}
-- ここにコードを書く
-- 1) User 型を宣言する
-- 2) describeUser(data: any): string — :: でキャストしてメッセージを構築する
-- 3) 3つのレコードすべての説明を出力する
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
Luau入門のすべてのレッスン
7プロジェクト:Typed Task Manager
プロジェクト:タスクの型定義タスクを追加する関数