Menu
Coddy logo textTech

型アサーション

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 ガードなど)を優先してください。

challenge icon

チャレンジ

簡単

型情報なしで 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つのレコードすべての説明を出力する
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

Luau入門のすべてのレッスン

自分で練習してみよう: Luaオンラインコンパイラ