Menu
CoddyTech

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 campi

Un 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).

challenge icon

Sfida

Facile

Leggi un record che arriva tipizzato come any.

  1. Scrivi type User = {id: number, username: string, isActive: boolean}.
  2. Scrivi local function describeUser(data: any): string che esegue il cast con local user = data :: User e restituisce `User {user.id}: {user.username} (Active: {user.isActive})`.
  3. 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

Esercitati da solo: Compilatore Luau online