形状の拡張
CoddyのLuaジャーニー「Luau入門」セクションの一部 — レッスン 41/73。
関連するシェイプはフィールドを共有することがよくあります。すべての Admin は User でもあります。共有フィールドを両方の宣言にコピーすると、それらが乖離してしまう原因になります。
エイリアスを組み合わせる際にインターセクション演算子 & を見かけたと思いますが、シェイプに対してもまったく同じように機能します。A & B は「AのすべてかつBのすべてを持つ」という意味になります:
type User = {name: string, age: number}
type Admin = User & {level: number}
-- Admin は現在、name、age、および level が必要です
local root: Admin = {name = "Root", age = 35, level = 9}TypeScriptではインターフェースに別の extends キーワードが必要ですが、Luauでは新しいものは何も必要ありません — インターセクションがすでにその役割を果たします。複数のパーツをチェーン接続することもできます:
type Contact = {email: string}
type Developer = User & Contact & {yearsExperience: number}& と | を混同しないでください。ユニオン A | B はどちらか一方のシェイプですが、インターセクション A & B は両方を同時に満たす必要があります。そして Admin はすべての User フィールドを持っているため、Admin の値は User が期待される任意の場所に渡すことができます。
チャレンジ
簡単以下の型エイリアスを作成してください:
Employee—id(number)、name(string)、department(string)Manager—Employeeを(&経由で)拡張したもの、teamSize(number) を持つContact—email(string)Developer—Employee、Contact、{yearsExperience: number}の交差(intersection)
以下を作成してください:
- 型
ManagerのteamLead— id101、name"Alice Johnson"、department"Engineering"、teamSize8 - 型
Developerのdev— id102、name"Bob Smith"、department"Engineering"、email"bob@company.com"、yearsExperience5
Manager を受け取り、[name] manages [teamSize] people を返す関数 getManagerSummary を作成してください。
それぞれを新しい行に出力してください:
getManagerSummary(teamLead)の結果devの[name] has [yearsExperience] years of experienceteamLeadの departmentdevの email
自分で試してみよう
-- ここにコードを書いてください
-- 1) Employee を定義し、次に Manager / Contact / Developer を & で
-- 2) teamLead と dev を作成する
-- 3) getManagerSummary を書く
-- 4) 要求された4行を出力する
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
Luau入門のすべてのレッスン
7プロジェクト:Typed Task Manager
プロジェクト:タスクの型定義タスクを追加する関数