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 checador de tipos do Luau — um valor tipado como any que você sabe que é na verdade um registro de usuário, por exemplo. Uma asserção de tipo (também chamada de cast) permite que você diga ao checker "confie em mim, trate este valor como este tipo". O operador de cast 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

Um cast altera apenas o que o checador de tipos acredita — ele não faz nada em tempo de execução. Ele nunca converte um valor: "5" :: any still é a string "5", não o number 5 (use tonumber para conversão real). E ele nunca valida: se você afirmar o tipo errado, o próprio cast não gerará erro — seu código simplesmente funcionará incorretamente later, quando tocar em campos que não estão lá.

Quando usar: quando um valor chega como any (ou uma união ampla) e você realmente conhece sua estrutura (shape). Quando não usar: para silenciar um erro de tipo que você não entende — o erro geralmente está te avisando sobre um bug real, e usar cast apenas o esconde. Prefira verificações reais (como as guardas de typeof na próxima lição) quando você 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 faz o cast de data para User com :: e retorna User [id]: [username] (Active: [isActive]) construído com interpolação de string.

O código inicial já define três registros brutos tipados como any. Chame describeUser em cada um deles e imprima os três resultados, em 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 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