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 camposUma 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.
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 faça a conversão dedataparaUsercom::e retorneUser [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
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 MapsPratique por conta própria: Compilador de Lua online