Menu
Coddy logo textTech

インターセクション型

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 テーブルにすぎません。交差型が存在するのはチェッカーのためだけです。

challenge icon

チャレンジ

簡単

2つの形状エイリアスを作成します。name: stringフィールドを持つHasNameと、age: numberフィールドを持つHasAgeです。

HasName & HasAgeの交差型としてPersonを作成します。

email: stringフィールドを持つHasEmailを作成し、3つすべての交差型HasName & HasAge & HasEmailとしてEmployeeを作成します。

次を宣言します。

  • 名前が"Alice"で、年齢が25user: 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) を出力してください
quiz icon腕試し

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

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

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