Menu
Coddy logo textTech

Типы пересечения (Intersection)

Часть раздела Введение в Luau путешествия по Lua на Coddy — урок 34 из 73.

Объединения указывают, что значение принадлежит к одному типу или к другому. Пересечения типов работают наоборот: амперсанд & объединяет структуры таблиц в тип, который содержит все поля каждой части:

type HasName = { name: string }
type HasAge = { age: number }

type Person = HasName & HasAge

-- у Person должны быть ОБА поля
local user: Person = {
    name = "Alice",
    age = 25,
}

Пропустите age, и средство проверки выдаст ошибку — пересечение работает как «и», а не как выбор по желанию. Это позволяет собирать большие структуры из небольших многоразовых фрагментов: определяйте узкоспециализированные типы для отдельных задач, а затем объединяйте их по мере необходимости:

type HasEmail = { email: string }

type Employee = HasName & HasAge & HasEmail

Важное примечание о Luau: объединять через пересечение следует структуры таблиц (и типы функций), а не примитивы. Выражение вроде number & string не имеет смысла, так как ни одно значение не может быть и тем, и другим одновременно. Когда вам нужна «эта структура плюс та структура», & — ваш инструмент.

Во время выполнения, разумеется, Person — это просто обычная таблица Lua; пересечение существует только для средства проверки.

challenge icon

Задание

Легко

Создайте два псевдонима типов: HasName с полем name: string и HasAge с полем age: number.

Создайте Person как пересечение HasName & HasAge.

Создайте HasEmail с полем email: string и Employee как пересечение всех трех типов: HasName & HasAge & HasEmail.

Объявите:

  • user: Person с именем "Alice" и возрастом 25
  • worker: Employee с именем "Bob", возрастом 30 и email "bob@company.com"

Создайте displayPerson(person: Person): string, возвращающую "Name: [name], Age: [age]", и displayEmployee(employee: Employee): string, возвращающую "Name: [name], Age: [age], Email: [email]".

Выведите displayPerson(user) и displayEmployee(worker) на отдельных строках.

Попробуйте сами

-- Напишите код здесь
-- type HasName = { name: string }, HasAge, HasEmail
-- type Person = HasName & HasAge
-- type Employee = HasName & HasAge & HasEmail
-- объявите user и worker, напишите две функции display,
-- выведите displayPerson(user) и displayEmployee(worker)
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Введение в Luau