Menu
Coddy logo textTech

Asserções de Tipo

Parte da seção Introdução ao Luau do Journey de Lua da Coddy. Lição 68 de 73.

Às vezes, você sabe mais sobre um valor do que o verificador de tipos do Luau: por exemplo, um valor tipado como any que você sabe que, na verdade, é um registro de usuário. Uma asserção de tipo (também chamada de conversão de tipo) permite dizer ao verificador: "confie em mim, trate este valor como este tipo". O operador de conversão de tipo do Luau é :::

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

local raw: any = {id = 42, username = "alice_dev"}
local user = raw :: User
print(user.username) -- o verificador agora conhece os campos

Uma conversão de tipo altera somente o que o verificador de tipos acredita. Ela não faz nada em tempo de execução. Ela nunca converte um valor: "5" :: any ainda é a string "5", não o número 5 (use tonumber para uma conversão de verdade). E ela nunca valida: se você afirmar o tipo errado, a própria conversão não causará um erro. Seu código simplesmente apresentará um comportamento incorreto mais tarde, quando acessar campos que não existem.

Quando usar: quando um valor chega como any (ou uma união abrangente) e você realmente conhece sua estrutura. Quando não usar: para silenciar um erro de tipo que você não entende: o erro geralmente está apontando para um bug real, e eliminá-lo com uma conversão apenas o oculta. Prefira verificações reais (como as proteções com typeof na próxima lição) quando puder verificar em tempo de execução.

challenge icon

Desafio

Fácil

Simule o processamento de registros que chegam de uma fonte externa sem informações de tipo.

  • Declare type User = {id: number, username: string, isActive: boolean}.
  • Escreva uma função describeUser(data: any): string que faça a conversão de data para User com :: e retorne User [id]: [username] (Active: [isActive]) criada com interpolação de strings.

O código inicial já define três registros brutos tipados como any. Chame describeUser para cada um deles e imprima os três resultados, na ordem.

Primeira linha esperada: User 42: alice_dev (Active: true)

Experimente você mesmo

-- Registros brutos de uma fonte externa: tipados como `any`
local rawUser1: any = {id = 42, username = "alice_dev", isActive = true}
local rawUser2: any = {id = 15, username = "bob_admin", isActive = false}
local rawUser3: any = {id = 99, username = "charlie_user", isActive = true}

-- Escreva o código aqui
-- 1) declare o tipo User
-- 2) describeUser(data: any): string — faça o cast com :: e construa a mensagem
-- 3) imprima a descrição de todos os três registros
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Introdução ao Luau

Pratique por conta própria: Compilador de Lua online