Menu
CoddyTech

Aserciones de tipo

Parte de la sección Introducción a Luau del Journey de Lua de Coddy. Lección 74 de 80.

Ya usaste :: una vez, en el capítulo sobre enumeraciones, para tratar io.read() como un Direction. En esta lección lo veremos en profundidad.

A veces sabes más sobre un valor que el comprobador de tipos de Luau: por ejemplo, sabes que un valor tipado como any es en realidad un registro de usuario. Una aserción de tipo (también llamada conversión de tipo) te permite decirle al comprobador «confía en mí, trata este valor como este tipo». El operador de conversión de Luau es :::

type User = {id: number, username: string}

local raw: any = {id = 42, username = "alice_dev"}
local user = raw :: User
print(user.username) -- el verificador ahora conoce los campos

Una conversión cambia solo lo que cree el comprobador de tipos. No hace nada en tiempo de ejecución. Nunca convierte un valor: "5" :: any sigue siendo la cadena "5", no el número 5 (usa tonumber para una conversión real). Y nunca valida: si afirmas que el tipo es incorrecto, la conversión en sí no generará un error. Tu código simplemente se comportará mal más adelante, cuando acceda a campos que no existen.

Cuándo usarla: cuando un valor llega como any (o una unión amplia) y realmente conoces su estructura. Cuándo no usarla: para silenciar un error de tipo que no entiendes: el error suele estar señalando un error real, y eliminarlo con una conversión solo lo oculta. Si puedes verificarlo en tiempo de ejecución, es preferible hacer comprobaciones reales (como las comprobaciones de typeof de la próxima lección).

challenge icon

Desafío

Fácil

Lee un registro que llega tipado como any.

  1. Escribe type User = {id: number, username: string, isActive: boolean}.
  2. Escribe local function describeUser(data: any): string, que hace una conversión de tipo con local user = data :: User y devuelve `User {user.id}: {user.username} (Active: {user.isActive})`.
  3. Imprime describeUser(rawUser2).

Pulsa Run Code: la salida muestra User 15: bob_admin (Active: false).

Pruébalo tú mismo

-- Registros sin procesar procedentes de fuera del programa: tipados como 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, conversión de tipo con ::
-- 3) imprimir describeUser(rawUser2)

Todas las lecciones de Introducción a Luau

Practica por tu cuenta: Compilador de Luau online