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 camposUna 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).
Desafío
FácilLee un registro que llega tipado como any.
- Escribe
type User = {id: number, username: string, isActive: boolean}. - Escribe
local function describeUser(data: any): string, que hace una conversión de tipo conlocal user = data :: Usery devuelve`User {user.id}: {user.username} (Active: {user.isActive})`. - 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
1Primeros pasos con Luau
¿Qué es Luau?¿Por qué usar Luau?Tu primer código en LuauComprobación de tipos y modos de errorRecapitulacion: Introducción a Luau4Trabajar con funciones
Tipado de parámetros y valores de retornoTipado de funciones anónimasFunciones que no devuelven nadaParámetros opcionalesValores predeterminados de parámetrosValores predeterminados para booleanosFunciones variádicasDefinir tipos de funcionesRepaso: funciones tipadas7Proyecto: Gestor de tareas tipado
Proyecto: La estructura de una tareaFunción para añadir una tarea2Tipos fundamentales
Número, cadena y booleanoEl tipo 'any': una salida de emergenciaEl tipo 'unknown'Tipos nulos y opcionalesLa inferencia de tipos en acciónAnotaciones de tipo explícitasRepaso: práctica de tipos fundamentales5Alias, Uniones e Intersecciones
Alias de tipos para primitivosTipos de uniónTrabajando con tipos de uniónTipos literalesTipos de intersecciónCombinando alias de tiposResumen: Combinaciones avanzadas de tipos3Tablas tipadas: arrays y mapas
Arrays tipadosAgregar y leer elementos¿Qué es un tipo mapa?Declarar y acceder a mapasRecorrer tablasTablas de formas mixtasLeer una cuadrículaConstruir una cuadrículatable.unpackRepaso: arrays y mapasPractica por tu cuenta: Compilador de Luau online