インターセクション型
CoddyのLuaジャーニー「Luau入門」セクションの一部。レッスン 34/73。
ユニオンは、値がある型または別の型であることを表します。交差型は反対の方向を指します。アンパサンド & はテーブル形状を組み合わせ、各部分のすべてのフィールドを持つ型を作ります。
type HasName = { name: string }
type HasAge = { age: number }
type Person = HasName & HasAge
-- Person は両方のフィールドを持たなければならない
local user: Person = {
name = "Alice",
age = 25,
}age を省略すると、チェッカーが不平を訴えます。交差型は「かつ」であり、決められた中から選ぶものでは決してありません。これにより、小さく再利用可能な部品から大きな形状を構築できます。個別の関心事ごとに焦点を絞った型を定義し、必要に応じてそれらを組み合わせます。
type HasEmail = { email: string }
type Employee = HasName & HasAge & HasEmail
Luau で重要な点が1つあります。交差させるのはテーブル形状(および function 型)であり、プリミティブではありません。number & string のようなものには意味がありません。1つの値が同時に両方になることはできないからです。「この形状にあの形状を加える」場合、& がそのためのツールです。
もちろん、実行時には Person は通常の Lua テーブルにすぎません。交差型が存在するのはチェッカーのためだけです。
チャレンジ
簡単2つの形状エイリアスを作成します。name: stringフィールドを持つHasNameと、age: numberフィールドを持つHasAgeです。
HasName & HasAgeの交差型としてPersonを作成します。
email: stringフィールドを持つHasEmailを作成し、3つすべての交差型HasName & HasAge & HasEmailとしてEmployeeを作成します。
次を宣言します。
- 名前が
"Alice"で、年齢が25のuser: Person - 名前が
"Bob"、年齢が30、メールアドレスが"bob@company.com"のworker: Employee
"Name: [name], Age: [age]"を返すdisplayPerson(person: Person): stringと、"Name: [name], Age: [age], Email: [email]"を返すdisplayEmployee(employee: Employee): stringを作成します。
displayPerson(user)とdisplayEmployee(worker)を別々の行に出力します。
自分で試してみよう
-- ここにコードを書いてください
-- type HasName = { name: string }, HasAge, HasEmail
-- type Person = HasName & HasAge
-- type Employee = HasName & HasAge & HasEmail
-- user と worker を宣言し、2つの display 関数を書いてください、
-- displayPerson(user) と displayEmployee(worker) を出力してください
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
Luau入門のすべてのレッスン
7プロジェクト:Typed Task Manager
プロジェクト:タスクの型定義タスクを追加する関数自分で練習してみよう: Luaオンラインコンパイラ