Menu
Coddy logo textTech

インターセクション型

CoddyのLuaジャーニー「Luau入門」セクションの一部 — レッスン 34/73。

ユニオン(Union)型は値が特定の型または別の型であることを表します。一方、インターセクション(Intersection)型はその逆で、アンパサンド & を使用して複数のテーブル形状を結合し、各パーツのすべてのフィールドを持つ型を作成します。

type HasName = { name: string }
type HasAge = { age: number }

type Person = HasName & HasAge

-- Person は両方のフィールドを持たなければならない
local user: Person = {
    name = "Alice",
    age = 25,
}

age を省略するとチェッカーが警告を出します。インターセクションは「AND」であり、自由に選択できるものではありません。これにより、小さく再利用可能なパーツから大きな形状を構築できます。別々の領域ごとに単一の役割を持つ型を定義し、必要に応じてそれらを組み合わせます。

type HasEmail = { email: string }

type Employee = HasName & HasAge & HasEmail

Luauにおける重要な注意点として、インターセクションはプリミティブ型ではなく、テーブル形状(および関数型)に対して使用してください。number & string のようなものは、両方を同時に満たす値が存在しないため無意味です。「この形状に加えてその形状も必要」という場合に、& が役立ちます。

もちろん、実行時には Person は単なる通常のLuaテーブルにすぎません。インターセクションは型チェッカーのためだけに存在します。

challenge icon

チャレンジ

簡単

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

HasName & HasAge の交差型(インターセクション)として Person を作成します。

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

以下を宣言します:

  • name が "Alice" で age が 25user: Person
  • name が "Bob"、age が 30、email が "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入門のすべてのレッスン