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 camposUma 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.
Desafio
FácilLeia um registro que chega tipado como any.
- Escreva
type User = {id: number, username: string, isActive: boolean}. - Escreva
local function describeUser(data: any): string, que faz a conversão de tipo comlocal user = data :: Usere retorna`User {user.id}: {user.username} (Active: {user.isActive})`. - 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
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
Tipagem de parâmetros e valores de retornoTipagem de funções anônimasFunções sem retornoParâmetros opcionaisValores padrão dos parâmetrosValores padrão para booleanosFunções variádicasDefinindo tipos de funçãoRecapitulação: funções tipadas2Tipos básicos
Número, string e booleanoO tipo 'any': válvula de escapeO tipo 'unknown'Tipos nulos e opcionaisInferência de tipos na práticaAnotações explícitas de tipoRevisão: prática com tipos básicos5Aliases, 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 Tipos3Tabelas Tipadas: Arrays e Maps
Arrays TipadosAdicionando e Lendo ElementosO que é um Tipo Map?Declarando e Acessando MapsPercorrendo TabelasTabelas com Formatos MistosLendo uma GradeConstruindo uma Gradetable.unpackRevisão: Arrays e MapsPratique por conta própria: Compilador de Luau online