インターセクション型
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テーブルにすぎません。インターセクションは型チェッカーのためだけに存在します。
チャレンジ
簡単2つの型のエイリアスを作成します: name: string フィールドを持つ HasName と、age: number フィールドを持つ HasAge。
HasName & HasAge の交差型(インターセクション)として Person を作成します。
email: string フィールドを持つ HasEmail を作成し、3つすべての交差型として Employee を作成します: HasName & HasAge & HasEmail。
以下を宣言します:
- name が
"Alice"で age が25のuser: 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) を出力する
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
Luau入門のすべてのレッスン
7プロジェクト:Typed Task Manager
プロジェクト:タスクの型定義タスクを追加する関数