型アサーション
CoddyのLuaジャーニー「Luau入門」セクションの一部。レッスン 68/73。
Luau の type checker よりも、ある値について多くのことを知っている場合があります。たとえば、any 型の値が実際には user レコードだと分かっている場合です。型アサーション(cast とも呼ばれます)を使うと、checker に「私を信じて、この値をこの 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 が変更するのは、type checker が信じる内容だけです。実行時には何もしません。値を変換することも決してありません。"5" :: any は依然として string の "5" であり、number の 5 ではありません(実際に変換するには tonumber を使います)。また、検証することもありません。間違った type をアサートしても、cast 自体はエラーになりません。存在しない fields にアクセスしたときに、コードは後になって単に誤動作します。
使う場合:any(または広い union)として値が渡され、その shape を本当に把握しているとき。使わない場合:理解していない type エラーを黙らせるために使うこと。エラーは通常、実際のバグについて伝えており、cast で取り除いてしまうと、バグを隠すだけです。実行時に検証できる場合は、実際のチェック(次のレッスンにある typeof ガードなど)を優先してください。
チャレンジ
簡単型情報なしで external source から到着する records の処理をシミュレートします。
type User = {id: number, username: string, isActive: boolean}を declare します。dataを::でUserに cast し、文字列補間で構築したUser [id]: [username] (Active: [isActive])を返す関数describeUser(data: any): stringを Write します。
starter code では、any 型の three 件の raw records がすでに定義されています。それぞれに対して describeUser を Call し、three つの結果を順番に print します。
Expected first line: 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
プロジェクト:タスクの型定義タスクを追加する関数自分で練習してみよう: Luaオンラインコンパイラ