Tipos de Interseção
Parte da seção Introdução ao Luau do Journey de Lua da Coddy. Lição 34 de 73.
Uniões dizem que um valor é de um tipo ou de outro. Tipos de interseção apontam na outra direção: o e comercial & combina estruturas de tabelas em um tipo que tem todos os campos de cada parte:
type HasName = { name: string }
type HasAge = { age: number }
type Person = HasName & HasAge
-- um Person deve ter AMBOS os campos
local user: Person = {
name = "Alice",
age = 25,
}Deixe de fora age e o verificador reclamará: uma interseção é um "e", nunca uma escolha entre opções. Isso permite criar estruturas grandes a partir de pequenas partes reutilizáveis: defina tipos focados para preocupações separadas e, em seguida, una-os conforme necessário:
type HasEmail = { email: string }
type Employee = HasName & HasAge & HasEmail
Uma observação importante sobre Luau: faça a interseção de estruturas de tabelas (e tipos function), não de tipos primitivos. Algo como number & string não faz sentido, pois nenhum valor pode ser ambos ao mesmo tempo. Quando você quiser "esta estrutura mais aquela estrutura", & é a ferramenta certa.
Em tempo de execução, é claro, um Person é apenas uma tabela Lua comum: a interseção existe somente para o verificador.
Desafio
FácilCrie dois aliases de forma: HasName com um campo name: string e HasAge com um campo age: number.
Crie Person como a interseção HasName & HasAge.
Crie HasEmail com um campo email: string e Employee como a interseção dos três: HasName & HasAge & HasEmail.
Declare:
user: Personcom nome"Alice"e idade25worker: Employeecom nome"Bob", idade30e e-mail"bob@company.com"
Crie displayPerson(person: Person): string retornando "Name: [name], Age: [age]" e displayEmployee(employee: Employee): string retornando "Name: [name], Age: [age], Email: [email]".
Imprima displayPerson(user) e displayEmployee(worker) em linhas separadas.
Experimente você mesmo
-- Escreva o código aqui
-- type HasName = { name: string }, HasAge, HasEmail
-- type Person = HasName & HasAge
-- type Employee = HasName & HasAge & HasEmail
-- declare user e worker, escreva as duas funções display,
-- imprima displayPerson(user) e displayEmployee(worker)
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 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