Menu
Coddy logo textTech

Chuleta de Luau

Modos de verificación de tipos

Un comentario en la primera línea del archivo decide con qué rigor comprueba Luau.

ModoSintaxis
Sin verificación de tipos--!nocheck
Por defecto: comprueba lo anotado--!nonstrict
Estricto: infiere y comprueba todo--!strict
Ejecutar un archivoluau main.luau
Verificar tipos sin ejecutarluau-analyze main.luau
Desactivar un aviso del linter--!nolint UnknownGlobal

Tipos básicos

Los tipos primitivos y cómo anotar una variable.

OperaciónSintaxis
Númerolocal age: number = 25
Cadenalocal name: string = "Ada"
Booleanolocal ok: boolean = true
Opcional (puede ser nil)local nick: string? = nil
Any (sin comprobación)local x: any = f()
Unknown (any más seguro)local x: unknown = f()
Never (siempre lanza error)function fail(): never error("boom") end
Nillocal n: nil = nil
Corrutina / bufferlocal co: thread, local b: buffer
Inferido: sin anotaciónlocal hp = 100 -- number

Tablas tipadas: arrays y mapas

Siguen siendo tablas de Lua; el tipo dice qué contienen.

OperaciónSintaxis
Array de númeroslocal xs: {number} = {1, 2, 3}
Array de cadenaslocal names: {string} = {}
Mapa (claves de cadena)local ages: {[string]: number} = {}
Mapa (cualquier tipo de clave)local seen: {[Player]: boolean} = {}
Array anidadolocal grid: {{number}} = {}
Array de formaslocal items: {{id: number}} = {}
Array de solo lecturalocal t = table.freeze({1, 2, 3})
Iterar (generalizado, solo Luau)for i, v in xs do print(i, v) end
Iterar claves y valoresfor k, v in pairs(ages) do end

Funciones

Anota los parámetros y el tipo de retorno; -> () significa que no devuelve nada.

OperaciónSintaxis
Parámetros y retorno tipadosfunction add(a: number, b: number): number
No devuelve nadafunction log(msg: string): () end
Retornos múltiplesfunction split(s: string): (string, string)
Parámetro opcionalfunction greet(name: string?) end
Valor por defectofunction greet(name: string?) name = name or "friend" end
Variádicafunction sum(...: number): number end
Función anónimalocal f = function(x: number): number return x * 2 end
Tipo de funcióntype Adder = (number, number) -> number
Parámetro de callbackfunction each(f: (number) -> ()) end

Alias de tipo, uniones y literales

Nombra un tipo una vez y reutilízalo en todas partes.

OperaciónSintaxis
Alias de un primitivotype Health = number
Unióntype Id = number | string
Opcional = unión con niltype Maybe = string | nil -- same as string?
Tipo literal (singleton)type Dir = "up" | "down"
Interseccióntype Both = Named & Aged
Alias genéricotype List<T> = {T}
Exportar desde un móduloexport type Point = { x: number, y: number }
Tipo de un valor existentetype Config = typeof(config)
Claves de un tipo de tablatype K = keyof<Point>

Formas de tabla y métodos

Describir objetos, y el self que llega con las llamadas con dos puntos.

OperaciónSintaxis
Forma en línealocal p: { x: number, y: number } = { x = 0, y = 0 }
Forma con nombretype Point = { x: number, y: number }
Propiedad opcionaltype User = { name: string, age: number? }
Forma + indexadortype Bag = { count: number, [string]: any }
Extender una formatype Admin = User & { level: number }
Método (atajo con dos puntos)function Point.move(self: Point, dx: number) end
Método en un tipotype Point = { move: (self: Point, dx: number) -> () }
Patrón de constructorfunction Point.new(x: number): Point end
Constantes congeladas (tipo enum)local Color = table.freeze({ Red = 1, Blue = 2 })

Genéricos

Una función o un tipo que sirve para muchos tipos de valor.

OperaciónSintaxis
Función genéricafunction id<T>(x: T): T return x end
Dos parámetros de tipofunction pair<A, B>(a: A, b: B): (A, B) end
Genérica sobre un arrayfunction first<T>(xs: {T}): T? return xs[1] end
Alias de tipo genéricotype Stack<T> = { items: {T} }
Instanciar un aliaslocal s: Stack<string> = { items = {} }
Función map genéricafunction map<T, U>(xs: {T}, f: (T) -> U): {U} end
Paquete genérico (variádico)function call<T...>(f: () -> T...): T... end

Estrechamiento, aserciones y guards

Convencer al verificador de que un valor es lo que tú ya sabes.

OperaciónSintaxis
Aserción de tipo (cast)local n = value :: number
Aserción pasando por anylocal n = (value :: any) :: number
Estrechar con typeofif typeof(x) == "string" then -- x es string end
Estrechar un opcionalif name then print(#name) end
Retorno temprano si es nilif not name then return end
Estrechar una unión literalif dir == "up" then end
Comprobación en ejecuciónassert(typeof(id) == "number", "id must be a number")
Afirmar que no es nil y usarlolocal item = assert(find(id), "missing item")

Operadores y sintaxis que Lua no tiene

Las mejoras del día a día: aquí es donde el código Luau deja de parecer Lua.

OperaciónSintaxis
Sumar y asignarhp += 10
Restar / multiplicar / dividirhp -= 5, dmg *= 2, dmg /= 2
División entera y asignaciónn //= 2
Módulo / potencia y asignaciónn %= 3, n ^= 2
Concatenar y asignarmsg ..= "!"
División enteralocal half = 7 // 2 -- 3
Interpolación de cadenasHello, {name}! You have {n} items. (entre comillas invertidas)
Interpolar una expresiónTotal: {price * qty} (entre comillas invertidas)
Continuar un buclefor _, v in xs do if v < 0 then continue end end
Expresión if-then-elselocal label = if hp > 0 then "alive" else "dead"
Expresión con else-if encadenadolocal t = if n > 0 then "pos" elseif n < 0 then "neg" else "zero"
Literales binarios / con separador0b1010, 1_000_000

Extras de biblioteca y diferencias con Lua

Funciones que Luau añade a la biblioteca estándar y funciones de Lua que elimina.

ElementoDetalle
Buscar un valor en un arraytable.find(xs, 42) -- índice o nil
Copia superficiallocal copy = table.clone(t)
Hacer inmutable / comprobartable.freeze(t), table.isfrozen(t)
Preasignar un arraytable.create(10, 0)
Clamp / round / signmath.clamp(x, 0, 1), math.round(x), math.sign(x)
Operaciones de bitsbit32.band(a, b), bit32.lshift(a, 1)
Eliminado por aislamientoio, package, loadstring, loadfile, dofile
Obsoleto pero aún presentegetfenv, setfenv (desactivan optimizaciones)
No existe en Luaugoto / etiquetas (Luau se basa en Lua 5.1)
Leer stdin en Coddyio.read() funciona aquí: Coddy lo restaura sobre Luau
Extensión de archivomain.luau (.lua también funciona)
Solo Roblox, no Luau basegame, workspace, Instance.new, task.wait

Luau es Lua 5.1 más un sistema de tipos gradual: el lenguaje que Roblox creó y liberó como código abierto. Esta chuleta de Luau cubre lo que *no* es Lua puro: anotaciones de tipo, tablas tipadas, uniones y tipos literales, genéricos, aserciones de tipo y el azúcar sintáctico que añade Luau (+=, interpolación de cadenas, continue, expresiones if-then-else). Para todo lo que comparten ambos lenguajes - tablas, metatablas, corrutinas, la biblioteca de cadenas - ten a mano la chuleta de Lua.

Todo lo que hay aquí es Luau estándar, ejecutable con la CLI luau y verificable con luau-analyze. Copia lo que necesites o pruébalo en vivo en el playground de Luau, sin instalar nada. ¿Empiezas con el sistema de tipos? El curso interactivo gratuito de Luau de Coddy lo construye lección a lección.

Preguntas frecuentes sobre la chuleta de Luau

¿Esta chuleta de Luau es gratis?
Sí. Esta chuleta de Luau es completamente gratuita y no requiere registro. Guárdala para la próxima vez que necesites la sintaxis de una unión, un genérico o una tabla tipada.
¿Luau tiene el operador +=?
Sí. A diferencia de Lua puro, Luau admite asignación compuesta: +=, -=, *=, /=, //=, %=, ^= y ..= para concatenar cadenas. Así que hp += 10 es Luau válido (y código válido de Roblox), mientras que en Lua 5.1 tienes que escribir hp = hp + 10. Ojo: en Luau no existen ++ ni --.
¿Cuál es la diferencia entre Lua y Luau?
Luau es un superconjunto de Lua 5.1 con un sistema de tipos gradual. Además de los tipos añade interpolación de cadenas con comillas invertidas, operadores de asignación compuesta, continue, expresiones if-then-else, división entera //, iteración generalizada (for i, v in t do) y funciones como table.find, table.clone y table.freeze. Por aislamiento elimina loadstring, loadfile, dofile y las bibliotecas io y package, y no tiene goto porque se basa en 5.1. La mayoría del código Lua normal funciona sin cambios como Luau.
¿Cómo activo la verificación de tipos en Luau?
Pon un comentario de modo en la primera línea del archivo: --!strict comprueba todo e infiere de forma agresiva, --!nonstrict (el valor por defecto) solo comprueba lo que anotaste y --!nocheck desactiva la comprobación. Fuera del editor, ejecuta luau-analyze main.luau para verificar tipos sin ejecutar, y luau main.luau para ejecutar.
¿Se escribe interface en Luau como en TypeScript?
No: Luau no tiene la palabra clave interface. Las formas de objeto se escriben como tipos de tabla y se nombran con type: type User = { name: string, age: number? }. Combina formas con & en lugar de extends y usa export type para que otros módulos puedan usarla.
¿Esta chuleta es lo mismo que programar en Roblox?
Todo lo que aparece aquí es Luau base - el lenguaje - así que sirve igual para scripts de Roblox y para Luau independiente. Lo que *no* está aquí es la API del motor de Roblox (game, workspace, Instance.new, servicios, eventos), que es una biblioteca sobre el lenguaje y la documenta Roblox, no Luau.
¿Dónde puedo ejecutar estos fragmentos de Luau?
En el playground de Luau: ejecuta el intérprete luau real en tu navegador, con soporte de stdin, así que puedes pegar cualquier fila de esta página y pulsar Ejecutar. Para práctica estructurada, el curso interactivo de Luau cubre el mismo material con ejercicios, proyectos y certificado.
Coddy programming languages illustration

Aprende Luau con Coddy

COMENZAR