Menu
CoddyTech

Asserções de Tipo

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

Você já usou :: uma vez, no capítulo sobre enums, para tratar io.read() como um Direction. Nesta lição, vamos analisar isso com mais atenção.

À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 apenas 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 fazer uma conversão de verdade). E ela nunca valida o valor: se você afirmar o tipo errado, a conversão em si não vai gerar um erro. Seu código simplesmente vai se comportar de forma incorreta mais tarde, quando acessar campos que não existem.

Quando usar: quando um valor chega como any (ou como uma união ampla) e você realmente conhece seu formato. Quando não usar: para silenciar um erro de tipo que você não entende: geralmente, o erro está indicando um problema real, e ignorá-lo com uma conversão apenas o esconde. Prefira verificações reais (como as condições de proteção com typeof na próxima lição) quando você puder validar o valor em tempo de execução.

challenge icon

Desafio

Fácil

Leia um registro que chega tipado como any.

  1. Escreva type User = {id: number, username: string, isActive: boolean}.
  2. Escreva local function describeUser(data: any): string, que faz a conversão de tipo com local user = data :: User e retorna `User {user.id}: {user.username} (Active: {user.isActive})`.
  3. Imprima describeUser(rawUser2).

Pressione Executar código: a saída mostra User 15: bob_admin (Active: false).

Experimente você mesmo

-- Registros brutos de fora do 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, conversão de tipo com ::
-- 3) imprima describeUser(rawUser2)

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

Pratique por conta própria: Compilador de Luau online