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 camposUm 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.
Desafio
FácilSimule 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): stringque faz ocastdedataparaUsercom::e retornaUser [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
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
1Começando com o Luau
O que é Luau?Por que usar Luau?Seu primeiro código em LuauVerificação de tipos e modos de erroRecapitulando: Introdução ao Luau4Trabalhando com Funções
Tipando Parâmetros e Valores de RetornoTipando Funções AnônimasFunções que Não Retornam NadaParâmetros OpcionaisValores Padrão para ParâmetrosFunções VariádicasDefinindo Tipos de FunçõesRecapitulação: Funções Tipadas2Tipos Fundamentais
Tipos Básicos: num, str, boolO Tipo 'any': Escape HatchO Tipo 'unknown'Tipos Nil e OpcionaisInferência de Tipos na PráticaAnotações Explícitas de TiposReciclagem: Prática de Tipos Fundamentais5Aliases, Uniões, Interseções
Aliases de Tipos para PrimitivosTipos de UniãoTrabalhando com Tipos de UniãoTipos LiteraisTipos de InterseçãoCombinando Aliases de TiposRecapitulando: Combinações Avançadas de Tipos8Enums, do Jeito Luau
O Padrão Enum no LuauEnums Numéricos com TablesEnums de String como UnionsUsando Enums de Union LiteralCongelando Tables ConstantesRecapitulação: Enums, do Jeito Luau11Tópicos Avançados
Asserções de TipoType Guards com typeofO Tipo neverSegurança Nula no Modo EstritoAssinaturas de ÍndiceRecapitulação: Ajuste Fino de Tipos3Tabelas Tipadas: Arrays e Maps
Arrays TipadosAdicionando e Lendo ElementosO que é um Tipo Map?Declarando e Acessando MapsIterando Sobre TabelasTabelas de Formato MistoArrays Tipados Multidimensionaistable.unpack e VarargsRecapitulando: Arrays e Maps