Schnittmengen-Typen (Intersection Types)
Teil des Abschnitts Einführung in Luau der Lua-Journey von Coddy. Lektion 34 von 73.
Unions besagen, dass ein Wert der eine oder der andere Typ ist. Schnittmengentypen weisen in die andere Richtung: Das kaufmännische Und & kombiniert Tabellenformen zu einem Typ, der alle Felder jedes Bestandteils enthält:
type HasName = { name: string }
type HasAge = { age: number }
type Person = HasName & HasAge
-- eine Person muss BEIDE Felder haben
local user: Person = {
name = "Alice",
age = 25,
}Lässt du age weg, beschwert sich der Prüfer: Eine Schnittmenge ist ein „und“, niemals eine beliebige Auswahl. So kannst du große Formen aus kleinen, wiederverwendbaren Bausteinen erstellen: Definiere fokussierte Typen für getrennte Verantwortlichkeiten und füge sie dann nach Bedarf zusammen:
type HasEmail = { email: string }
type Employee = HasName & HasAge & HasEmail
Ein wichtiger Hinweis zu Luau: Verknüpfe Tabellenformen (und Funktionstypen), nicht primitive Typen. Etwas wie number & string ist bedeutungslos, da kein Wert gleichzeitig beides sein kann. Wenn du „diese Form plus jene Form“ möchtest, ist & dein Werkzeug.
Zur Laufzeit ist ein Person natürlich einfach eine gewöhnliche Lua-Tabelle: Die Schnittmenge existiert nur für den Prüfer.
Aufgabe
EinfachErstelle zwei Formaliase: HasName mit einem name: string-Feld und HasAge mit einem age: number-Feld.
Erstelle Person als die Schnittmenge HasName & HasAge.
Erstelle HasEmail mit einem email: string-Feld und Employee als die Schnittmenge aller drei: HasName & HasAge & HasEmail.
Deklariere:
user: Personmit dem Namen"Alice"und dem Alter25worker: Employeemit dem Namen"Bob", dem Alter30und der E-Mail-Adresse"bob@company.com"
Erstelle displayPerson(person: Person): string, das "Name: [name], Age: [age]" zurückgibt, und displayEmployee(employee: Employee): string, das "Name: [name], Age: [age], Email: [email]" zurückgibt.
Gib displayPerson(user) und displayEmployee(worker) in separaten Zeilen aus.
Probier es selbst
-- Schreibe den Code hier
-- type HasName = { name: string }, HasAge, HasEmail
-- type Person = HasName & HasAge
-- type Employee = HasName & HasAge & HasEmail
-- deklariere user und worker, schreibe die zwei display-Funktionen,
-- gib displayPerson(user) und displayEmployee(worker) aus
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Einführung in Luau
1Erste Schritte mit Luau
Was ist Luau?Warum Luau nutzen?Dein erster Luau-CodeTypprüfung & FehlermodiZusammenfassung: Einführung in Luau4Arbeiten mit Funktionen
Typisierung von Parametern & RückgabewertenTypisierung von anonymen FunktionenFunktionen ohne RückgabewertOptionale ParameterStandard-ParameterwerteVariadische FunktionenDefinieren von FunktionstypenZusammenfassung: Typisierte Funktionen2Grundtypen
Grundlegende Typen: num, str, boolDer Typ 'any': Der AuswegDer Typ 'unknown'Nil- & optionale TypenTypinferenz in der PraxisExplizite TypannotationenZusammenfassung: Praxis zu Grundtypen5Typ-Aliase, Union-Typen und Schnittmengen-Typen
Typ-Aliase für PrimitivenUnion-TypenArbeiten mit Union-TypenLiterale TypenSchnittmengen-Typen (Intersection Types)Kombination von Typ-AliasenZusammenfassung: Fortgeschrittene Typ-Kombinationen3Typisierte Tabellen: Arrays & Maps
Typisierte ArraysHinzufügen und Lesen von ElementenWas ist ein Map-Typ?Deklarieren und Zugreifen auf MapsIterieren von TabellenGemischt-strukturierte TabellenMehrdimensionale typisierte Arraystable.unpack und VarargsZusammenfassung: Arrays und MapsÜbe selbstständig: Online-Lua-Compiler