Asserzioni di tipo
Fa parte della sezione Introduzione a Luau del percorso Lua di Coddy. Lezione 74 di 80.
Hai già usato :: una volta, nel capitolo sugli enum, per trattare io.read() come un Direction. In questa lezione lo vedremo nel dettaglio.
A volte sai più cose su un valore di quante ne sappia il controllo dei tipi di Luau: per esempio, un valore di tipo any che sai essere in realtà un record utente. Un’asserzione di tipo (detta anche cast) ti permette di dire al controllo dei tipi: «fidati, tratta questo valore come se fosse di questo tipo». L’operatore di cast di Luau è :::
type User = {id: number, username: string}
local raw: any = {id = 42, username = "alice_dev"}
local user = raw :: User
print(user.username) -- il verificatore ora conosce i campiUn cast cambia solo ciò che il controllo dei tipi ritiene vero. Non fa nulla durante l’esecuzione. Non converte mai un valore: "5" :: any è ancora la stringa "5", non il numero 5 (usa tonumber per una vera conversione). E non convalida mai il valore: se asserisci il tipo sbagliato, il cast in sé non genererà un errore. Il tuo codice si comporterà semplicemente in modo errato più avanti, quando accederà a campi che non esistono.
Quando usarlo: quando un valore arriva come any (o come un’unione ampia) e conosci davvero la sua struttura. Quando non usarlo: per mettere a tacere un errore di tipo che non capisci: di solito l’errore ti segnala un bug reale e nasconderlo con un cast non fa che occultarlo. Quando puoi verificare il valore durante l’esecuzione, preferisci controlli reali (come le verifiche con typeof della prossima lezione).
Sfida
FacileLeggi un record che arriva tipizzato come any.
- Scrivi
type User = {id: number, username: string, isActive: boolean}. - Scrivi
local function describeUser(data: any): stringche esegue il cast conlocal user = data :: Usere restituisce`User {user.id}: {user.username} (Active: {user.isActive})`. - Stampa
describeUser(rawUser2).
Premi Run Code: l'output mostra User 15: bob_admin (Active: false).
Provalo tu
-- Record grezzi provenienti dall'esterno del programma: con tipo any
local rawUser1: any = {id = 7, username = "nina_dev", isActive = true}
local rawUser2: any = {id = 15, username = "bob_admin", isActive = false}
-- 1) type User = {...}
-- 2) describeUser(data: any): string, conversione di tipo con ::
-- 3) print describeUser(rawUser2)
Tutte le lezioni di Introduzione a Luau
1Per iniziare con Luau
Che cos'è Luau?Perché usare Luau?Il tuo primo codice LuauVerifica dei tipi e modalità di erroreRiepilogo: introduzione a Luau4Lavorare con le funzioni
Tipizzare parametri e valori restituitiTipizzare le funzioni anonimeFunzioni che non restituiscono nullaParametri opzionaliValori predefiniti dei parametriValori predefiniti per i booleaniFunzioni variadicheDefinire i tipi di funzioneRiepilogo: funzioni tipizzate7Progetto: Gestore di attività tipizzato
Progetto: La struttura di un'attivitàFunzione per aggiungere un'attività2Tipi fondamentali
Numero, stringa e booleanoIl tipo 'any': una via di fugaIl tipo 'unknown'Tipi nil e opzionaliL’inferenza dei tipi in praticaAnnotazioni esplicite dei tipiRipasso: esercizi sui tipi fondamentali5Alias, unioni e intersezioni
Alias di tipo per i primitiviTipi unioneLavorare con i tipi unioneTipi letteraliTipi intersezioneCombinare gli alias di tipoRiepilogo: combinazioni avanzate di tipi3Tabelle tipizzate: array e mappe
Array tipizzatiAggiungere e leggere elementiChe cos'è un tipo map?Dichiarare e accedere alle mappeIterare sulle tabelleTabelle con forme misteLeggere una grigliaCreare una grigliatable.unpackRiepilogo: array e mappeEsercitati da solo: Compilatore Luau online