Tipos de Interseção
Parte da seção Introdução ao Luau do Journey de Lua da Coddy — lição 34 de 73.
Unions dizem que um valor é um tipo ou outro. Intersection types funcionam no sentido oposto: o e comercial & combina formatos de tabelas em um tipo que possui todos os fields 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 o age e o verificador vai reclamar — uma interseção é um "e", nunca uma escolha opcional. Isso permite construir grandes formatos a partir de peças pequenas e reutilizáveis: defina tipos focused para preocupações separadas, depois una-os together conforme necessário:
type HasEmail = { email: string }
type Employee = HasName & HasAge & HasEmail
Uma observação importante sobre o Luau: faça interseção de formatos de tabela (e tipos de função) — não de primitivos. Algo como number & string não faz sentido, já que nenhum valor pode ser ambos ao mesmo tempo. Quando você quiser "este formato mais aquele formato", o & é a sua ferramenta.
Em tempo de execução, é claro, um Person é apenas uma tabela Lua comum — a interseção existe apenas para o verificador.
Desafio
FácilCrie dois aliases de tipo: 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 de todos os três: HasName & HasAge & HasEmail.
Declare:
user: Personcom nome"Alice"e idade25worker: Employeecom nome"Bob", idade30, e email"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 Maps