Menu
Coddy logo textTech

Types intersections

Fait partie de la section Introduction à Luau du Journey Lua de Coddy. Leçon 34 sur 73.

Les unions indiquent qu’une valeur est d’un type ou d’un autre. Les types d’intersection vont dans l’autre direction : l’esperluette & combine des formes de tables en un type qui possède tous les champs de chaque partie :

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

type Person = HasName & HasAge

-- une Person doit avoir les DEUX champs
local user: Person = {
    name = "Alice",
    age = 25,
}

Omettez age et le vérificateur se plaint : une intersection est un « et », jamais un choix à la carte. Cela vous permet de construire de grandes formes à partir de petits éléments réutilisables : définissez des types ciblés pour des préoccupations distinctes, puis assemblez-les selon vos besoins :

type HasEmail = { email: string }

type Employee = HasName & HasAge & HasEmail

Une remarque importante concernant Luau : faites des intersections de formes de tables (et de types function), pas de types primitifs. Quelque chose comme number & string n’a aucun sens, puisqu’aucune valeur ne peut être les deux à la fois. Lorsque vous voulez « cette forme plus cette forme », & est l’outil qu’il vous faut.

À l’exécution, bien sûr, un Person est simplement une table Lua ordinaire : l’intersection n’existe que pour le vérificateur.

challenge icon

Défi

Facile

Créez deux alias de forme : HasName avec un champ name: string, et HasAge avec un champ age: number.

Créez Person comme l’intersection HasName & HasAge.

Créez HasEmail avec un champ email: string, et Employee comme l’intersection des trois : HasName & HasAge & HasEmail.

Déclarez :

  • user: Person avec le nom "Alice" et l’âge 25
  • worker: Employee avec le nom "Bob", l’âge 30 et l’adresse e-mail "bob@company.com"

Créez displayPerson(person: Person): string qui renvoie "Name: [name], Age: [age]", ainsi que displayEmployee(employee: Employee): string qui renvoie "Name: [name], Age: [age], Email: [email]".

Affichez displayPerson(user) et displayEmployee(worker) sur des lignes distinctes.

Essayez vous-même

-- Écrire le code ici
-- type HasName = { name: string }, HasAge, HasEmail
-- type Person = HasName & HasAge
-- type Employee = HasName & HasAge & HasEmail
-- déclarez user et worker, écrivez les deux fonctions d'affichage,
-- affichez displayPerson(user) et displayEmployee(worker)
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Introduction à Luau

Entraînez-vous par vous-même : Compilateur Lua en ligne