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 и электронной почтой "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

Потренируйтесь самостоятельно: Онлайн-компилятор Lua