Structures vs tables libres
Fait partie de la section Introduction à Luau du Journey Lua de Coddy. Leçon 42 sur 80.
Tu as maintenant deux façons de travailler avec des tables d’enregistrements : la méthode libre que tu as toujours utilisée en Lua, et les formes déclarées. Il vaut la peine de s’arrêter un instant pour voir ce que chacune t’apporte.
Une table libre accepte tout. Cette flexibilité a un prix : si tu orthographies mal un champ (user.nmae), tu obtiens silencieusement nil ; si tu oublies un champ, le bogue apparaît bien plus tard, à l’exécution, dans le premier code qui touche à cette entrée manquante :
local user = {name = "Ana", age = 20}
print(user.nmae) -- table non stricte : affiche nil sans avertissementDéclare une forme et ces erreurs passent de l’exécution au moment de l’édition. Le vérificateur signale la faute de frappe dès que tu l’écris, ton éditeur peut compléter automatiquement les noms de champs, et la déclaration type sert aussi de documentation sur le contenu de la table :
type User = {name: string, age: number}
local user: User = {name = "Ana", age = 20}
print(user.nmae) -- ✗ erreur de type : clé 'nmae' introuvable dans UserSi tu viens de TypeScript, note que Luau n’a pas de mot-clé interface : type permet de décrire toutes les formes. Il n’y a pas non plus de « fusion des déclarations » : déclarer deux types portant le même nom dans la même portée est une erreur, donc chaque forme a exactement une définition.
Les formes de Luau sont structurelles : toute table contenant les bons champs avec les bons types correspond, quel que soit l’endroit ou la manière dont elle a été créée. Les tables libres ont aussi leur utilité : les scripts rapides et les données véritablement dynamiques n’ont pas besoin d’une forme déclarée. Toutefois, pour tout ce qui est transmis entre des fonctions, une forme permet de détecter les erreurs tant qu’elles sont encore faciles à corriger.
Défi
FacileTransforme une table non typée en une table dont la forme est déclarée.
- Au-dessus de la table, écris
type Pet = {name: string, age: number}. - Annote la table :
local pet: Pet = {name = "Biscuit", age = 3}. - Sous le premier affichage, ajoute
print(pet.age).
Appuie sur Exécuter le code : la sortie affiche Biscuit et 3.
Essayez vous-même
-- Une table non contrainte : rien ne vérifie ses champs
local pet = {name = "Biscuit", age = 3}
print(pet.name)
Toutes les leçons de Introduction à Luau
1Premiers pas avec Luau
Qu'est-ce que Luau ?Pourquoi utiliser Luau ?Votre premier code LuauVérification de type et modes d'erreurRécapitulatif : Introduction à Luau4Travailler avec les fonctions
Typer les paramètres et les valeurs de retourTyper les fonctions anonymesFonctions sans valeur de retourParamètres optionnelsValeurs par défaut des paramètresValeurs par défaut pour les booléensFonctions variadiquesDéfinir des types de fonctionsRécapitulatif : fonctions typées7Projet : gestionnaire de tâches typé
Projet : la structure d’une tâcheFonction pour ajouter une tâche2Types fondamentaux
Nombre, chaîne de caractères et booléenLe type « any » : une échappatoireLe type « unknown »Types nil et optionnelsL’inférence de types en actionAnnotations de type explicitesRécapitulatif : exercices sur les types fondamentaux5Alias, unions et intersections
Alias de types pour les types primitifsTypes unionsTravailler avec les types unionsTypes littérauxTypes intersectionsCombinaison d'alias de typesRécapitulatif : Combinaisons de types avancées3Tables typées : tableaux et maps
Tableaux typésAjouter et lire des élémentsQu’est-ce qu’un type Map ?Déclarer et accéder aux mapsParcourir les tablesTables de formes mixtesLire une grilleConstruire une grilletable.unpackRécapitulatif : tableaux et maps6Typage des structures de tables
Annotations de structures en ligneAlias de types pour les structuresPropriétés optionnellesStructures vs tables libresExtension de structuresAjout de méthodes aux structuresMéthodes avec Self et deux-pointsRécapitulatif : Définir des structures de tablesEntraînez-vous par vous-même : Compilateur Luau en ligne